vscode 插件:
minapp-标签属性智能补全
框架:
1.小程序的启动
微信在打开小程序之前,把整个代码包下载到本地
读取 app.json 的 pages 字段知道所有的页面路径,然后通过 pages 字段的第一个值的路径装载并渲染首页
启动后,在 app.js 定义的 App 实例的 onLaunch 回调被执行
2.注册程序:App()
app.js:是小程序入口,其中调用 App()函数来注册一个小程序,参数为小程序的声明周期回调等等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| App({ onLaunch(options) { // 初始化完成时调用(全局只触发一次) // 参数里可以拿到当前路径、场景代号等,可以通过wx.getLaunchOptionsSync获取 }, onShow(options) { // 在启动、从后台进入前台时调用(后台是指用户点击右上角的关闭或者按了设备的home键离开微信,再次打开时进入前台) // 小程序运行机制:https://developers.weixin.qq.com/miniprogram/dev/framework/operating-mechanism.html // 用wx.onAppShow可以绑定监听 // 参数同onLaunch },
onHide() { // 从前台进入后台时触发 // 用wx.onAppHide可以绑定监听 },
onError(msg) { // 脚本错误、api调用失败时触发 // 用wx.onError可以绑定监听 },
onPageNotFound() { // 要打开的页面不存在时触发 // 参数带有页面信息 // 用wx.onPageNotFound可以绑定监听 },
// 除此之外可以添加任意方法或数据 // 可以用this可以访问 globalData: {} })
|
全局的 getApp()函数可以用来获取到小程序 App 实例。
3.注册页面:Page()
Page(Object)用来注册一个页面,参数可以指定页面的初试数据,生命周期回调,事件处理函数等。
高级用法是用 Component 创建页面,就可以使用自定义组件的特性,比如用 behaviors 进行代码复用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| Page({ data: { // 页面初始数据,页面加载时data会以JSON字符串的形式由逻辑层传至渲染层 // data中的数据必须是字符串、数字、布尔值、对象、数组 // 渲染层可以通过WXML进行数据绑定 text: 'This is page data.' },
onLoad(query) { // 监听页面加载 // 参数可以获取打开当前页面路径中的参数 // 例:当前url为../logs/logs?abc=1,参数query即为{"abc": 1} },
onShow() { // 监听页面显示/切入前台事件 console.log(this.route) // this中还有当前页面的路径 },
onReady() { // 监听页面初次渲染完成,一个页面只会调用一次,表示页面可以和视图层进行交互 // 如果要对界面内容进行设置,要在onReady之后的生命周期进行 },
onHide() { // 监听页面隐藏/切入后台事件 // 如navigateTo或tab切换到其他页面 },
onUnload() { // 监听页面卸载 // 如redireactTo或navigateBack到其他页面 },
onPullDownRefresh() { // 监听用户下拉刷新动作 // 需要在app.json的window选项或页面配置中开启enablePullDownRefresh // 可以通过wx.startPullDownRefresh触发 // 处理完数据刷新后,wx.stopPullDownRefresh可以停止下拉刷新 },
onReachBottom() { // 监听上拉触底事件 // 在app.json的window选项或页面配置中设置触发距离onReachBottomDistance },
onShareAppMessage(Object) { // 用户点击右上角转发,或点击转发按钮<button open-type="share" /> // 参数 Object包含from: button/menu,target:button/undefined,webViewUrl:<web-view>的url return { title: '', // 默认为当前小程序名称 path: '', // 转发路径,当前页面的完整路径 imageUrl: '' // 显示图片路径,支持png/jpg,默认使用默认截图,长宽比为5:4 } },
onPageScroll(Object) { // 页面滚动触发事件 // 参数中的scrollTop可以获取页面在垂直方向已滚动的距离px // 不要定义空方法,减少不必要的事件派发对渲染层-逻辑层通信的影响 // 避免过于频繁的执行setState引起通信操作,传递大量数据会影响通信耗时 },
onResize(res) { // 页面尺寸改变触发事件 // 在手机上/ipad启用屏幕旋转支持可以触发 // 读取页面的显示尺寸,可以用SelectorQuery.selectViewport() res.size.windowWidth // 新的显示区域宽度 res.size.windowHeight // 新的显示区域高度 },
onTabItemTap(item) { // 当前是tab页时,点击tab时触发 console.log(item.index) // 被点击tabItem的序号 console.log(item.pagePath) // 被点击tabItem的页面路径 console.log(item.text) // 被点击tabItem的按钮文字 },
// 其他函数和数据 // 定义组件事件处理函数,在渲染层的组件中加入事件绑定,就会进入到事件处理函数 // <view bindtap="viewTap">click me</view> viewTap() { this.setData({ text: 'Set some data for updating view.' // 支持修改数组中的某一项或对象的某个属性,并且可以不需要在this.data中预先定义,不要设为undefined }, function () { // this is setData callback }) },
customData: { hi: 'MINA' } })
|
4.页面路由
所有页面的路由都由框架以栈的形式进行管理。getCurrentPages()用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。
App.onLaunch 的时候不要调用 getCurrentPages(),这时候 page 还没有生成。
路由方式和对应的声明周期:

Tab 切换对应的生命周期,A、B 为 tabbar 页面,C 是从 A 页面打开的,D 是从 C 页面打开的

5.WXML 和 vue 的 template 用法区别
列表渲染
不需要写 item,index in array,默认当前项变量名为 item,当前下标变量名为 index,可以使用 wx:for-item、wx:for-index 重新制定当前元素和下标的变量名。
如果是动态渲染的列表,需要用 wx:key 来制定列表中项目的唯一标识符,值可以是唯一的字符串/数字,或保留关键字*this(代表在 for 循环中的 item 本身)。当数据改变触发渲染层重新渲染时,会矫正带有 key 的组件,确保他们被重新排序而不是重新创建,以确保使组件保持自身的状态,提高列表渲染时的效率。
1
| <view wx:for="{{array}}"></view>
|
注:wx:for 的值为字符串时,会将字符串解析成字符串数组,花括号之间有空格,会被解析成字符串。
事件使用方式
冒泡事件:key 以 bind(不会阻止冒泡事件向上冒泡)、catch(阻止冒泡事件向上冒泡)开头,非原生组件中,bind 和 catch 可以紧跟一个冒号,含义不变,如 bind-tap
非冒泡事件:key 以 capture-bind、capture-catch(中断捕获阶段和取消冒泡阶段)
1
| <view id="tapTest" data-hi="WeChat" bindtap="tapName">点击</view>
|
支持使用 WXS 函数绑定时间,接收 event 和 ownerInstance 两个参数,ownerInstance 和 event.instance 一样是一个 ComponentDescriptor 对象,可以设置组件的样式和 class。
1 2 3 4 5 6 7 8 9 10
| <wxs module="wxs" src="./test.wxs"></wxs> <view id="tapTest" data-hi="WeChat" bindtap="{{wxs.tapName}}">点击</view>
// test.wxs function tapName(event, ownerInstance) { console.log('tap wechat', JSON.stringify(event)) } module.exports = { tapName }
|
import:在文件中使用目标文件定义的 template,有作用域的概念,不会 import 目标文件 import 的 template。
1 2 3 4 5 6 7 8
| <!-- A.wxml --> <template name="A"> <text>A template</text> </template>
<!-- B.wxml --> <import src="a.wxml" /> <template is="A" />
|
include:将目标文件除了template标签和wxs标签之外的整个代码引入,相当于拷贝到 include 位置。
1 2 3 4 5 6
| <!-- index.wxml --> <include src="header.wxml" /> <view>body</view>
<!-- header.wxml --> <view>header</view>
|