一、app.js
每个微信小程序必须在app.js中进行程序的注册,并且只能注册一次。因此,主逻辑文件app.js
中必须包含注册的方法。
1.1 App()
App()
函数用来注册一个小程序。接受一个object参数,其指定小程序的生命周期函数等。
ooject类型:onLaunch、onShow、onHide、onError、onPageNotFound、其他。
App({
onLaunch: function(options) {
// Do something initial when launch.
},
onShow: function(options) {
// Do something when show.
},
onHide: function() {
// Do something when hide.
},
onError: function(msg) {
console.log(msg)
},
onPageNotFound(res) {
wx.redirectTo({
url: 'pages/...'
})
},
globalData: 'I am global data'
})
注意:
①
App()
必须在app.js中注册,且不能注册多个。
②不要在定义于App()
内的函数中调用getApp()
,使用this
就可以拿到app实例。
③不要在onLaunch的时候调用getCurrentPage()
,此时page还没有生成。
④通过getApp()
获取实例之后,不要私自调用生命周期函数。
二、数据绑定
数据绑定使用"Mustache"语法(双大括号)将变量包起来。
三、列表渲染和条件渲染
3.1 列表渲染 wx:for
使用 wx:for-item
可以指定数组当前元素的变量名,
使用 wx:for-index
可以指定数组当前下标的变量名:
3.2 条件渲染 wx:if 、wx:elif
和wx:else
wx:if
vshidden
因为wx:if
之中的模板也可能包含数据绑定,所以当wx:if
的条件值切换时,框架有一个局部渲染的过程,因为它会确保条件块在切换时销毁或重新渲染。
同时wx:if
也是惰性的,如果在初始渲染条件为false
,框架什么也不做,在条件第一次变成真的时候才开始局部渲染。
相比之下,hidden
就简单的多,组件始终会被渲染,只是简单的控制显示与隐藏。
一般来说,wx:if
有更高的切换消耗而hidden
有更高的初始渲染消耗。因此,如果需要频繁切换的情景下,用hidden
更好,如果在运行时条件不大可能改变则wx:if
较好。
四、template模板
<!--定义模板 -->
<template name="msgItem">
<view>
<text> qqqqq </text>
<text> 22222 </text>
</view>
</template>
<!--使用模板 -->
<template is="msgItem"/>
使用is属性,声明需要的使用的模板,然后将模板所需要的data传入;
is属性也可以使用Mustache语法,来动态决定具体需要渲染哪个模板;
五、事件
- 事件是视图层到逻辑层的通讯方式。
- 事件可以将用户的行为反馈到逻辑层进行处理。
- 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
- 事件对象可以携带额外信息,如id, dataset, touches。
5.1 事件分类
事件分为冒泡事件和非冒泡事件
- 冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。
- 非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。
bind
事件绑定不会阻止冒泡事件向上冒泡,catch
事件绑定可以阻止冒泡事件向上冒泡。
WXML的冒泡事件列表:
类型 | 触发条件 |
---|---|
touchstart | 手指触摸动作开始 |
touchmove | 手指触摸后移动 |
touchcancel | 手指触摸动作被打断,如来电提醒,弹窗 |
touchend | 手指触摸动作结束 |
tap | 手指触摸后马上离开 |
longtap | 手指触摸后,超过350ms再离开 |
5.2 dataset
在组件中可以定义数据,这些数据将会通过事件传递给 SERVICE。书写方式:以data-
开头,多个单词由连字符-
链接,不能有大写(大写会自动转成小写)如data-element-type
,最终在 event.target.dataset 中会将连字符转成驼峰elementType
。
<view data-alpha-beta="1" data-alphaBeta="2" bindtap="bindViewTap"> DataSet Test </view>
Page({
bindViewTap:function(event){
event.target.dataset.alphaBeta === 1 // - 会转为驼峰写法
event.target.dataset.alphabeta === 2 // 大写会转为小写
}
})
六、引用 import和include
6.1 import
import
可以在该文件中使用目标文件定义的template //<import src="item.wxml"/>
6.2 include
include
可以将目标文件除了<template/>
的整个代码引入,相当于是拷贝到include
位置 //include src="header.wxml"/>
PS:import有作用域的概念,即只会import目标文件中定义的template,而不会import目标文件import的template。