wxml
数据绑定
mustache方式:{{message}}
绑定文本:
在index.js中
Pages({data: {message: "Hello, world"}})
在index.wxml中:
<view><text>{{message}}</text></view>
绑定属性:
Pages({data: {theName: "Jack"}})
<view><text data-name="{{theName}}"></text></view>
运算符绑定
Pages({data: {flag: false}})
<view hidden="{{flag ? true : false}}">Hidden</view>
将显示Hidden
还有:字符串运算,组合式绑定,扩展运算符绑定。
id,class、style、hiddle、data-、bind / catch*
列表渲染
<!--index.html--><view><block wx:for="{{items}}" wx:for-item="item" wx:key="index"><view>{{index}}:{{item.name}}</view></block></view>//index.jsPage({data: {items: [{name: "A"},{name: "B"},{name: "C"},{name: "D"},{name: "E"},]}})
最终显示:
0:A
1:B
2:C
3:D
4:E
条件渲染
<!---index.wxml--><view>今天吃什么?</view><view wx:if="{{codition === 1}}">饺子</view><view wx:elif="{{codition === 2}}">米饭</view><view>面食</view>//index.jsPage({data: {condition: Math.floor(Math.random()*3+1)}})
最终结果:
今天吃什么?
面食(这个不一定,Math.random()是0-1的浮点随机数,Math.floor向下取整,整体是取1-3的随机整数)
wx:if条件渲染和hidden可以类比,wx:if在页面频繁切换时影响效率,hiddle在初始化加载时慢。
模板引用
<!--index.wxml--><!--模板--><template name="tempItem"><view><view>收件人:{{name}}</view><view>联系方式:{{phone}}</view><view>地址:{{address}}</view></view></template><!--引用模板--><template is="tempItem" data="{{...item}}"></template>
//index.jsPage({data: {item: {name: "张三",phone: "188",address: "中国"}}})
最终输出:
收件人:张三
联系方式:188
地址:中国
文件引用
import
<!--index.wxml--><import src="a.wxml"></import><template is="a"></template><!--a.wxml--><view>Hello</view><template>World!</template>
最终只会打印出World!,因为只打印引用的模板里的内容。
<!--index.wxml--><import src="a.wxml"></import><template is="a"></template><!--a.wxml--><import src="c.wxml"></import><template name="a">This is a.wxml</template><template is="b"></template><template name="b">This is b.wxml</template>
最终输出:This is a.wxml
作用域,只能引用template里的内容,template里再引用别的template是不会被引用的,小程序的设计避免死循环问题。避免a引b,b引a
include
和import不同,include是把目标文件除模板之外的东西都拷贝。
src引用可以是绝对,也可以是相对路径。
<!--index.wxml--><include src="a.wxml"/><template is="a"></template><!--a.wxml--><template name="a"><view>This is a.wxml</view></template><view>Hello.world</view>
最后输出:
Hello,world
WXSS
WeiXin Style Sheets是一套样式语言,用于描述WXML的组件样式
CSS(Cascading Style Sheets)是一套样式语言,描述html和xml的呈现。
WXSS基于CSS的修改:
1、尺寸单位rpx;响应式像素
2、样式导入;
3、内联样式
4、选择器;
rpx:
设备像素(device pixels)设备控制显示最小物理单位;
CSS像素(css pxels)逻辑像素;
PPI/DPI(pixel per inch)每英寸拥有像素数量;
DPR(device pixel Ratio)手机某一方向上设备像素和CSS像素之比
rpx是微信团队开发的。rpx最终转换为rem
WXSS特性之样式
外联样式导入
使用@import 导入,好处是,不同页面有相同值元素时,可以抽离成外联样式成文件,从而减少文件资源大小。
<!--index.wxml--><view class="container">Hello,world!</view>
/** index.wxss **/@import './assets.wxss';.container {color: red;}
/** assets.wxss **/.container {border: 1px solid #000;}

样式文件执行有顺序,从上到下,从左到右,如果在index.wxss中定义container的border是黄色,则最终会覆盖黑色,结果是黄色。
wxss不仅支持外联样式,也支持内联样式。

wxss选择器

选择器优先级:

!important优先级最高,会覆盖其他任何生命,会破坏样式固有的级联规则。什么时候使用呢?
用别人插件时,在插件外用!important修改插件样式。
wxml和wxss使页面基本视图,页面怎么能动态交互起来,那就是javascript
javaScript
轻量、解释型、面向对象的头等函数语言,动态的基于原型和多范式脚本语言,支持面向对象、命令式、函数式的编程风格。
java和javascript关系相当于雷锋和雷峰塔的关系。
推荐书:
《javascript高级程序设计》《javascript权威指南》
nodeJs中JavaScript实现

Native是原生模块,可以具备javascript不具备的能力;
npm是包管理系统,世界上最大开源库生态系统;
nodejs常用于后端实现;
小程序javascript的实现

和浏览器的javascript相比,没有Bom和Dom对象,所以jQuery、是无法使用的。缺少nodeJs的Native和Npm模块。
和javascript相似的ECMAScript:
语法、类型、语句、关键字、从操作符、对象
nodeJs的js、浏览器里的js、小程序的js都是基于ECMAScript的实现,各封装了其模块和特性。
浏览器js组成:

小程序宿主环境差异

IDE微信开发者工具是nwjs渲染。
大部分使用ES5、ES6。IOS8,IOS9并没兼容ES6,所以开发者工具中和真机,同样代码表现是不同的,所以用远程调试。
WXS
逻辑层javascript,小程序自己的脚本语言WXSS
wxs模块作用域:私有,对外不可见。
index.wxml中module定义模块名,message对外不可见,用module对象的exports暴露给外部;
可以用require函数引用其他wxs文件:
以下index.wxml中
这样index.wxml中就可以使用message变量了。需要注意,同一个页面不能同时引用wxs名,否则后面的会覆盖前面的。
注释
单行注释://
多行注释:/ /
结尾注释:/*
可以看到打印出的是1,说明多行注释生效。
/*后面的d=3没打印出来,说明结尾注释生效。
运算符

基本:加减乘除
一元:左移,自增,正负运算;
位运算:按位与。。
等值:等于、非等于、全等、非全等
赋值:a=a+1
二元:a || b,a and b
WXS语句
和js差不多,但不支持try、catch语句
WXS数据类型

生成date用getDate函数生成,regexp用getRegexp函数,不能用new运算。判断数据类型时用construct属性判断。
WXS提供了以下6种基础类库:
和js ES5标准一样。其他基础类库去ES5标准的js标准文档了解。
到目前为止,小程序的框架基本四个组成部分学完了
MINA框架讲解

三部分:
视图层(wxml、wxss样式)、逻辑层(manager处理逻辑,服务中心,封装API接口,只有一个App Service)、系统层(原生能力,视图层和逻辑层双线程通信,提供了数据传输,事件系统,二者通过系统层提供的jsBridge通信,逻辑层把事件变化通知到视图层,页面更新)
AppService调用setData函数将数据从逻辑层传到视图层,将差异应用到节点树。可以了解ES5的原理。
小程序运行机制
第一次启动很慢,后面打开就快了
1、冷启动:
首次打开后,被微信销毁后,再次打开;
销毁:
- 小程序进入后台时,一定时间内,客户端会帮助维护状态,超过时间后被销毁,目前是5min
- 短时间内收到两次告警时,会被销毁,时间是5s
2、热启动:
用户已打开,一定时间再次打开,后台切换为前台。
3、更新
如果再次打开时,小程序程序包已经更新版本,这是后微信怎么处理?
冷启动发现有新版本,如发现有版本更新,则会异步下载新包,同时用本地包打开小程序,再下次启动时会用新包。如果要立即使用新包,可以调用API,这个在后面讲。
小程序加载流程

CDN(内容分发网络)提供响应速度,提高效率。
生命周期
应用生命周期

第一次进入时,客户端会初始化运行环境,同时在CDN或者本地拿到代码包,注入到运行环境,初始化完毕,会向逻辑层AppJs的App实例发送OnLaunch事件,逻辑层App.js的APP构造器的参数的onLaunch方法会被调用,进入后,用户点击左上角关闭,或手机Home建离开小程序后,没被销毁,进入后台,逻辑层App.js的APP构造器的参数的onHide方法会被调用,再次打开时,唤醒后台进入前台,逻辑层App.js的APP构造器的参数的onShow方法会被调用,当脚本错误,或API调用错误,会触发OnError方法,给其传错误信息,GlobalData代表,应用全局数据。
页面生命周期

初始化时,会逻辑层定义的配置实例发送onLoad,onLoad会被调用,再销毁前只被调一次,onLoad回调,会拿到当前页面的打开参数,页面显示后,会调用onShow方法。其他页面返回到当前页面也会调用onShow。初次渲染完成后onReady方法被调用,同样,页面没销毁前只被调用一次。当onReady调用完后,逻辑层和视图层就可以交互,从当前打开新的页,会调用onHide方法,关闭当前页会触发onUnload方法。data表示当前页面小程序数据。

两个线程:view、appservice
appservice创建后一次调用onLoad、onShow,可请求服务器数据
view创建后告诉appservice已初始化好,appservice会给view初始化好的数据,view拿到后触发首次渲染,告诉appservice渲染完毕,appservice会接收到onReady调用,onReady调用后,服务器上数据就拿到了,再次发送给view,view拿到后再次渲染……
页面路由
多页面小程序,路由都由框架管理,用栈的方式维护页面。
初始化:a打开,栈里只有a
打开新页面:a基础上打开b,b入栈,有啊a、b两个页面
页面重定向:b重定向到c,c入栈,b出栈,只有啊a、c两个页面。
页面返回:c页面点返回,c出栈,只剩a页面
Tab切换:所有页面都出栈,只留tab页
重加载:所有页面都出栈,只留tab页
触发方式

事件流

如何绑定组件上某个事件呢?
点击后,控制台打印内容:
type:触发事件类型;
timestamp:时间戳;
target:事件根源组件;组件id,类型,data自定义属性集合;
currentTarget:事件绑定当前组件,当前组件id,类型,data自定义属性集合;
二者区别:后面讲事件流时会讲到;
touches:数组,每个元素都是一个touch对象,表示停留在屏幕上触摸点信息,
changedTouches:和touches数据格式一样,表示有变化的触摸点,从有到无,无到有,位置变化。
detail:表示绑定各个事件所携带的数据,格外信息。比如,点击时x,y表示触摸点距离文档左上角的距离,媒体播放状态的事件会携带些媒体状态,时间戳等。
_requireActive:
当给某一个组件绑定事件,并触发时,小程序怎么处理?
小程序的事件模型处理:
三阶段:自上向下
事件捕获阶段:所绑定的事件会才从最外层节点,向下传播到目标节点元素,依次检查,元素经过的节点,是否绑定了同一事件类型的监听函数,如果有就执行对应函数;
事件处理函数:到达目标节点,执行事件函数;
事件冒泡函数:目标节点自下而上冒泡到最外层节点,依次检查经过节点是否绑定同样事件类型定义的回调函数,有则执行。
target:事件根源组件;组件id,类型,data自定义属性集合;
currentTarget:事件绑定当前组件,当前组件id,类型,data自定义属性集合;

可捕获事件:
touchstart:手指按下屏幕的事件;
touchmove:手指在按下屏幕后移动的事件;
touchcancel:手指在屏幕上时,被来电提醒打断事件;
touchend:离开屏幕事件;
tap:手指点击屏幕一次操作,小于350ms;
longpress:手指长按,超过350ms;不会触发tap事件;
longtap:手指长按,超过350ms;会触发tap事件;
推荐使用longpress
可冒泡事件:
可捕获事件都是可冒泡。
还包括动画事件:
transitionend:界面动画结束时触发;
transitionstart:wxss动画开始;
transitioniteration:wxss动画执行一次迭代;
animationend:wxss动画结束;
touchforcechange:在iphone设备下,有3Dtouch触发后;


点container-C后,控制台打印click container-C、click container-B、click container-A,向上冒泡,可以看到bind属性不会阻止事件冒泡。


点击B后,先A到B的捕获事件,后B到A的冒泡事件。可以看出bind不会阻止冒泡,capture可以绑定捕获阶段,catch阻止捕获和冒泡事件。
不懂。。。。
view容器

提供了8类组件:
视图容器组件
控制页面内容,理解为盒子,盒子里可以有更小的盒子
view:最常用容器组件
官方文档:https://developers.weixin.qq.com/miniprogram/dev/component/view.html

点击红色后变为70%透明度的黑色,同时绿色块也被点击;加了hover-stop-propageation=”true”后,点击红色块时,绿色块没有点击效果。
scroll-view:滚动容器组件
可滚动的视图区域组件。
官网文档:
https://developers.weixin.qq.com/miniprogram/dev/component/scroll-view.html

示例有点儿复杂,再视频中消化。第31讲:scroll-view容器。
swiper:轮播组件
滑块容器。
https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html
示例有点儿复杂,再视频中消化。第32讲:swiper滑块容器。
wx:key=”this” this表示当前元素item,但只能是数字和字符串。
movable-view:移动、缩放组件
可移动的视图容器,在页面中可以拖拽滑动。movable-view必须在 movable-area 组件中,并且必须是直接子节点,否则不能移动。
https://developers.weixin.qq.com/miniprogram/dev/component/movable-view.html
示例有点儿复杂,再视频中消化。第33讲:movable-view移动,缩放容器。
调试器、模拟器中是不能缩放的,需要在真是机器上做。
cover-view原生视图容器
和view不同,可以盖原生组件,比如clrs、radio
https://developers.weixin.qq.com/miniprogram/dev/component/cover-view.html
cover-view和cover-image结合使用,播放视频,暂停和播放图片会覆盖在cover-view上显示。
基础内容

icon
图标组件
https://developers.weixin.qq.com/miniprogram/dev/component/icon.html
icon的类型,有效值:success, success_no_circle, info, warn, waiting, cancel, download, search, clear

文本组件text
最基本文本展示。
selectable表示是否可选,可选即可复制。
rich-text富文本
可以去展示文本的html标签。
https://developers.weixin.qq.com/miniprogram/dev/component/rich-text.html

progress进度条
https://developers.weixin.qq.com/miniprogram/dev/component/progress.html

表单组件
button
https://developers.weixin.qq.com/miniprogram/dev/component/button.html
查看API文档,可以获取用户手机号码。
checkbox多选组件
https://developers.weixin.qq.com/miniprogram/dev/component/checkbox.html
form
表单提交
https://developers.weixin.qq.com/miniprogram/dev/component/form.html
input
https://developers.weixin.qq.com/miniprogram/dev/component/input.html
label
https://developers.weixin.qq.com/miniprogram/dev/component/label.html
picker
https://developers.weixin.qq.com/miniprogram/dev/component/picker.html
从底部弹起的滚动选择器。底部弹起的收货地址。
picker-view
嵌入页面的滚动选择器。其中只可放置 picker-view-column组件,其它节点不会显示。https://developers.weixin.qq.com/miniprogram/dev/component/picker-view.html
有时候不让组件从底部弹起,而是让用户页面选择。
radio
单选项目。
https://developers.weixin.qq.com/miniprogram/dev/component/radio.html
slider
滑动选择器。
https://developers.weixin.qq.com/miniprogram/dev/component/slider.html
switch
开关选择器。一个checkbox时可以用switch代替,可以绑定bindChange事件。
textarea
多行输入框。
https://developers.weixin.qq.com/miniprogram/dev/component/textarea.html
导航
navigator
帮助我们小程序应用页面内跳转。
| 值 | 说明 | 最低版本 |
|---|---|---|
| navigate | 对应 wx.navigateTo 或 wx.navigateToMiniProgram 的功能 | 表示最新打开的页面 |
| redirect | 对应 wx.redirectTo 的功能 | 当前页面重定向到另一个页面,原地跳转 |
| switchTab | 对应 wx.switchTab 的功能 | 当前页面切换到另一个tab页面 |
| reLaunch | 对应 wx.reLaunch 的功能 | 在当前页重新加载 |
| navigateBack | 对应 wx.navigateBack 的功能 | 当前页进行返回操作 |
| exit | 退出小程序,target="miniProgram"时生效 |
2.1.0 |

媒体组件
audio
音频

image

video

camera
系统相机组件,需要用户授权。
live-pusher
直播,不同类目权限不一样。不能模拟,需在真机上调试。
live-player
实时音视频录制
地图
https://developers.weixin.qq.com/miniprogram/dev/component/map.html
画布
https://developers.weixin.qq.com/miniprogram/dev/component/canvas.html
开放能力
opon-data
用于展示微信开放的数据。用户昵称、用户性别等
https://developers.weixin.qq.com/miniprogram/dev/component/open-data.html
web-view
承载网页的容器。会自动铺满整个小程序页面,个人类型的小程序暂不支持使用。
https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html
API概述



海底捞排队等餐就是直调函数,等排到了,服务员过来让你开始就餐,就是回调函数。
两种方式创建动画。
1、Animation wx.createAnimation(Object object)
创建一个动画实例 animation。调用实例的方法来描述动画。最后通过动画实例的 export 方法导出动画数据传递给组件的 animation 属性。可以链式调用。

2、
置顶
第58讲open-data。动态设置置顶栏文字内容,使用wx.setTopBarText(Object object) API
