微信小程序
项目结构
pages:小程序页面集合,每个子目录表示一个页面
页面例子
index:欢迎页,小程序的首页
logs:日志页
页面目录结构,所有的文件名与页面名相同
.js:页面脚本文件,即页面逻辑
概念
监听并处理页面的生命周期函数
获取小程序实例
声明并处理页面的数据
响应页面的交互事件
注册页面Page(),传入一个对象参数
对象参数
data:页面的初始数据
初始数据会传到渲染层(布局结构),在布局中使用{{属性名}}的方式调用
生命周期函数
页面动作相关函数
事件处理函数:响应渲染层的事件绑定信号
prototype
Page.prototype.route:获取当前页面的路径
Page.prototype.setData():将数据从逻辑层发送到视图层,同时改变对应的this.data的值
参数:传入一个对象,作为初始数据data的新值
data:要改变的数据,以key,value的形式表示将this.data的key改变成value
callback:回调函数,界面渲染完毕后调用
在函数中调用this.setData({'属性':'新值'})
其它:添加任意函数或数据,使用this调用
文件作用域:文件中声明的变量和函数只在该文件中有效
模块:将公共的代码抽离成为一个单独的js文件作为一个模块
在模块文件里导出变量或函数
module.exports.sayHello = sayHello
exports.sayGoodbye = sayGoodbye
在其它js文件中导入公共模块
导入模块:var common = require('common.js')
引用模块函数或变量:common.sayHello()
.json:页面配置文件
概念
页面配置文件会覆盖小程序的配置文件
.wxss:页面样式表文件
概念
页面样式表会覆盖小程序的样式表
.wxml:页面结构文件,即页面布局
数据绑定:引用逻辑层的data对象的属性
组件的内容: {{ message }}
组件的属性:
组件的控制属性:
关键字:
运算
三元运算: Hidden
算数运算: {{a + b}} + {{c}} + d
逻辑判断:
字符串运算:{{"hello" + name}}
数据路径运算:{{object.key}} {{array[0]}},object,array分别为data对象的属性
组合:构成新的对象或数组
数组: {{item}}
最终组合成数组[0, 1, 2, 3, 4]
对象
合成对象:
最终组合成的对象是 {for: 1, bar: 2}
展开对象:扩展运算符 ... 来将一个对象展开
最终组合成的对象是 {a: 1, b: 2, c: 3, d: 4, e: 5}。
使用原来的key和value:
最终组合成的对象是 {foo: 'my-foo', bar:'my-bar'}。
注意
如有存在变量名相同的情况,后边的会覆盖前面
花括号和引号之间如果有空格,将最终被解析成为字符串
"{{[1,2,3]}} "解析为"{{[1,2,3] + ' '}}"
控制流程
循环:wx:for,为数组每个元素渲染组件
遍历数组
{{index}}: {{item.message}}
array是一个对象数组,index是当前项索引名,item是当前项变量名
遍历数组,指定当前项索引名和变量名
{{idx}}: {{itemName.message}}
wx:for-index:指定当前项索引名
wx:for-item:指定当前项变量名
嵌套循环
{{i}} * {{j}} = {{i * j}}
用在标签上,以渲染一个包含多节点的结构块
{{index}}: {{item}}
状态跟随:wx:key,指定列表中列表项的唯一标识符
使列表项的状态跟随列表项在列表位置的变化
注意
当 wx:for 的值为字符串时,会将字符串解析成字符串数组
花括号和引号之间如果有空格,将最终被解析成为字符串
条件:wx:if
判断是否需要渲染该代码块
True
多层判断
1
2
3
打包多个元素:block wx:if, 一次性判断多个标签组件
并不是个组件,仅仅是一个包装元素,不会渲染
wx:if消耗高,hidden消耗低
模板:在模板中定义代码,在不同地方调用
定义模板
使用标签定义模板,name属性指定模板的名字,
*
使用模板
使用is属性声明要使用的模板,使用data属性传入使用的数据
is属性可以使用Mustache语法来决定渲染哪个模板
注意:模板有自己的作用域,只能使用data传入的数据
事件
作用
事件是视图层到逻辑层的通信方式
事件可以将用户的行为反馈到逻辑层进行处理
事件可以绑定在组件上,事件触发时调用逻辑层的处理函数
事件对象可以携带额外信息,如id,dataset,touches
事件的使用方式
在组件中使用bindtap绑定一个事件处理函数
绑定: Click me!
data表示传入的数据对象,hi表示对象的属性,WeChat是该属性的值
在逻辑层定义相应的事件处理函数,参数是event
Page({tapName: function(event) {console.log(event)}})
事件详解
事件分类
冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递
touchstart
touchmove
touchcancel
touchend
tap
longpress
longtap
transitionend
animationstart
animationiteration
animationend
非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递
事件绑定:以key/value的形式表示
bind绑定:不会阻止冒泡事件向上冒泡
catch绑定:可以阻止冒泡事件向上冒泡
绑定方法:关键字加上事件类型,如bingtap,catchtouchstart,或bing:tap,catch:touchstart
事件捕获阶段:位于冒泡阶段之前,在捕获阶段中,事件到达节点的顺序与冒泡阶段相反
capture-bing
capture-catch
事件对象
BaseEvent基础事件对象
currentTarget:以data-开关的自定义属性,传递数据到逻辑层
在视图层定义方法: DataSet Test
在逻辑层里访问的方法:event.currentTarget.dataset.alphabeta
CustomEvent自定义事件对象
detail:自定义事件所携带的数据
表单组件用户的输入
媒体的错误事件携带的错误信息
点击事件的坐标信息
TouchEvent触摸事件对象
使用事件对象的方法
在视图层中通过key/value的形式给事件对象属性赋值
在逻辑层通过形参event.EventObject.attr访问这事件对象的属性
引用:两种引用方式
import:
在其它文件定义模板
{{text}}
在另一个文件引用模板
import的作用域:即只会导入目标文件定义的模板,而不会导入目标文件import的其它模板
include:使用目标文件代替当前位置
body
页面路由:由框架进行管理
页面栈:以栈的方式维护页面动作
getCurrentPages():获取页面栈的所有页面,第一个元素为首页,最后一个元素为当前页
路由方式
初始化
打开新页面
页面重定向
页面返回
Tab切换
重加载
app.js:小程序脚本文件,即小程序的逻辑层
概念
监听并处理小程序的生命周期函数
声明小程序全局变量,通过小程序实例来调用
调用框架api
获取小程序实例instance = getApp()
注意
App()必须在app.js中注册,且不能注册多个
不要在定义于App()内的函数中调用getApp(),使用this引用app实例
不要在onLaunch的时候调用getCurrentPages(),此时page还没有生成
通过getApp()获取实例后,不要私自调用生命周期函数
注册小程序App(),传递一个对象参数
对象参数定义小程序的生命周期函数与其它数据
onLaunch
onShow
onHide
onError
其它:注册的数据可通过this调用
app.json:小程序配置文件,根对象为json对象
概念
配置小程序页面构成
配置小程序窗口背景色
配置导航条样式
配置默认标题
不可添加注释
属性
pages属性:字符串列表,表示小程序的页面组成,记录pages目录下小程序每一个页面"pages/页面目录/页面名"
window属性,指定默认的窗口
状态栏
导航条
窗口标题
窗口背景色
tabBar属性:对象,指定默认的tab标签页
list属性:对象列表,每个对象表示一个tab标签页,最少2个,最多5个
pagePaht属性:指定页面路径
text属性:指定标签标题
networkTimeout属性:对象,设置各种网络请求的超时时间
debug属性:Boolean值,是否开启调试模式
app.wxss:小程序样式表文件