小程序学习笔记(一)

代码组成

小程序由配置文件json,模板文件wxml,样式代码wxss,以及逻辑代码javascript组成

一、JSON配置

小程序中,JSON扮演静态配置角色
在创建的小程序的根目录下,有两个json文件,app.json和project.config.json,在每个pages页面目录下,也有一个json文件,这几个json文件分别是什么功能呢?

app.json

app.json文件是当前小程序的全局配置,包括所有页面路径、界面表现、网络超时时间、底部TAB等,配置方式如下

代码片段1-1:

  "pages": ["pages/index/index", "pages/logs/logs"],
  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "WeChat",
    "navigationBarTextStyle": "black"
  }
}

其中:
pages字段 —— 用于描述当前小程序所有页面路径,这是为了让微信客户端知道当前你的小程序页面定义在哪个目录。
window字段 —— 定义小程序所有页面的顶部背景颜色,文字颜色定义等。

工具配置 project.config.json

你在工具上做的任何配置都会写入到project.config.json这个文件中,当你重新安装工具或者换电脑工作时,你只要载入同一个项目的代码包,开发者工具就自动会帮你恢复到当时你开发项目时的个性化配置,其中会包括编辑器的颜色、代码上传时自动压缩等等一系列选项。

页面配置 page.json

用于对单个页面进行配置,页面的配置只能设置 app.json 中部分 window 配置项的内容,页面中配置项会覆盖 app.json 的 window 中相同的配置项

二、WXML

wxml在小程序中充当html的角色,wxml也由标签和属性构成,但也有不一样的地方
1.小程序中的标签是包装好的标签,如view, button, text ,还提供了地图、视频、音频等等组件能力
2.多了一些 wx:if 这样的属性以及 {{ }} 这样的表达式,使用方式与vue等MVVM框架相似

模板语法

通过{{}}将变量绑定到界面上:<text> {{text}}</text>
属性也可以动态绑定:<text data-test="{{test}}"> hello world</text>

注意:没有被定义的变量的或者是被设置为 undefined 的变量不会被同步到 wxml 中

逻辑语法

{{}}内可以进行简单的逻辑运算
三元运算:<text>{{ a === 10? "变量 a 等于10": "变量 a 不等于10"}}</text>
算数运算:<view> {{a + b}} + {{c}} + d </view>
字符串拼接:<view>{{"hello " + name}}</view>
{{ }}中还可以直接放置数字、字符串或者是数组

<text>{{[1,2,3]}}</text>
<!-- 输出 1,2,3 -->
<text>{{"hello world"}}</text>
<!-- 输出 hello world -->
条件逻辑

WXML中使用 wx:if="{{condition}}"进行逻辑渲染

<view wx:if="{{condition}}"> True </view>

使用wx:elifwx:else来书写一个else块

<view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>
列表渲染

在组件上使用wx:for进行列表渲染,默认变量index为数组当前下标,变量item为数组的当前项

<!--WXML-->
<view wx:for="{{list}}">{{index}}: {{item.message}</view>

<!--对应的脚本-->
Page({
  data: {
    list: [{message: 1},{message: 2},{message: 2}]
  }
})

可以使用wx:for-item指定数组当前元素的变量名,可以使用wx:for-index指定数组当前下标的变量名

<view wx:for="list" wx:for-item="name" wx:for-index="idx">{{idx}}:{{name}}</view>

wx:key用来指定列表中项目的唯一标识符,取值可以是以下两种

1.字符串。必须是列表中的某一个属性值,且该属性值在列表中必须是唯一的
2.使用关键字this与item本身进行绑定,这就要求item本身是唯一的数字或字符串

在数据发生改变的时候,绑定了key的组件只会被重新排序,不会被重新渲染,以确保组件保持自身的状态

<!--this绑定示例-->
<switch wx:for="{{numberArray}}" wx:key="*this" > {{item}} </switch>
模板

WXML提供模板,可以在模板中定义代码片段,在别处调用

<!--
{
  index: 0,
  msg: 'this is a template',
  time: '2016-06-18'
}
-->

<template name="msgItem">
  <view>
    <text> {{index}}: {{msg}} </text>
    <text> Time: {{time}} </text>
  </view>
</template>

<template is="msgItem" data="{{...item}}"/> //使用data传入模板需要的数据

<!-- 输出
0: this is a template Time: 2016-06-18
-->

is可以动态决定需要渲染哪个模板

<template name="odd">
  <view> odd </view>
</template>

<template name="even">
  <view> even </view>
</template>

<block wx:for="{{[1, 2, 3, 4, 5]}}">
  <template is="{{item % 2 == 0 ? 'even' : 'odd'}}"/>
</block>
引用

WXML提供了两种文件引用方式importinclude
在一个wxml文件中通过import的方式可以使用另一个wxml文件中定义的模板

在 item.wxml 中定义了一个叫 item的 template :

<!-- item.wxml -->
<template name="item">
  <text>{{text}}</text>
</template>

在 index.wxml 中引用了 item.wxml,就可以使用 item模板:

<import src="item.wxml"/>

<template is="item" data="{{text: 'forbar'}}"/>

需要注意的是 import 有作用域的概念,即只会 import 目标文件中定义的 template,而不会 import 目标文件中 import 的 template,简言之就是 import 不具有递归的特性。

include 可以将目标文件中除了 <template/> <wxs/> 外的整个代码引入,相当于是拷贝到 include 位置

共同属性

所有wxml标签都支持的属性称为共同属性


微信截图_20190110142246.png

三、WXSS

介绍

wxss充当css的角色
app.wxss中为项目公共样式
pages下的wxss为页面样式
其它样式可以被公共样式和页面样式引用
在小程序开发中不必考虑样式文件的请求数量,样式代码最终会被编译优化

尺寸单位

wxss是使用rpx作为尺寸单位

样式引用
@import './test_0.wxss'

小程序中的样式文件引用不会产生多余的文件请求

内联样式

小程序支持动态更新内联样式

<view style="color: {{color}};font-size: {{fontSize}}"></view>
选择器

小程序支持id,类,标签和伪元素(after,before)选择器

样式优先级

小程序样式优先级与css相同

官方样式库

小程序提供了WeUI.wxss基础样式库 https://github.com/Tencent/weui-wxss

WeUI是一套与微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一。包含button、cell、dialog、progress、toast、article、actionsheet、icon等各式原生。

javascript脚本

浏览器中的javascript由ECMAScript,BOM和DOM组成
小程序中的javascript由ECMAScript 以及小程序框架和小程序 API 来实现的,没有BOM和DOM对象,所以类似 JQuery、Zepto这种浏览器类库是无法在小程序中运行起来的

作用域

在文件中声明的变量和函数只在该变量内有效
如果想定义全局函数:global.globalValue = 'globalValue'
需要注意的是必须保证全局变量定义的文件需要在使用的文件之前执行,当需要保证全局的数据可以在任何文件中安全的被使用到,那么可以在 App() 中进行设置

//app.js 定义全局变量
App({
  globalData: 1
})

//a.js使用全局变量
var app = getApp()
//改变全局变量的值
app.globalData++ 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容