微信小程序框架的视图层用WXML 和WXSS 编写,由组件来进行展示。将逻辑层的数据在视图层中进行渲染,同时将视图层的事件发送给逻辑层。
WXML(WeiXin Markup Language)用于描述页面的结构,
WXSS(WeiXin Style Sheet)用于描述页面的样式,
组件(Component)是视图的基本组成单元。
通过双大括号({{}})将变量包起来,在WXML页面中将数据值显示出来。
WXML页面中的动态数据都是来自.js文件Page下的data。
index.wxml
{{ message }}
index..js
Page({
data: {
message: 'Hello MINA!'
}
})
1.组件属性绑定
将data中的数据绑定到微信小程序的组件上。
Page({
data: {
id: 0
}
})
2.控制属性绑定
用来进行if语句条件判断,如果满足条件,则执行,否则不执行
Page({
data: {
condition: true
}
})
3.关键字绑定
常用于组件的一些关键字。
像复选框组件,checked关键字如果等于true,则代表复选框选中,false代表不选中复选框
不要直接写成checked="false",否则其计算结果是一个字符串,转成boolean 类型后代表真值。
4.运算
在{{}} 内可以进行简单的运算,主要支持以下几种方式的运算:
1.三元运算
Hidden
2.数学运算
{{a + b}} + {{c}} + d
Page({
data: {
a: 1,
b: 2,
c: 3
}
})
view中的显示内容为3+3+d
3.逻辑判断
4.字符串运算
{{"hello"+name}}
Page({
data:{
name:'MINA'
}
})
5.数据路径运算
{{object.key}} {{array[0]}}
Page({
data: {
object: {
key: 'Hello'
},
array: ['MINA']
}
})
1.wx:if判断单个组件
在微信小程序框架中,使用wx:if=”{{condition}}”来判断是否需要渲染该代码块
True
使用wx:elif 和wx:else 来添加一个else 块
1
2
3
2.block wx:if判断多个组件
wx:if 是一个控制属性,需要将它添加到一个标签上。
如果想一次性判断多个组件标签,可以使用
view1
view2
注:
1.wx:for 列表渲染单个组件
在组件上使用wx:for控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。
默认数组当前项的下标变量名为index,数组当前项的变量名为item
{{index}}: {{item.message}}
Page({
data: {
array: [{
message: 'foo',
}, {
message: 'bar'
}]
}
})
使用wx:for-item 可以指定数组当前元素的变量名,使用wx:for-index 可以指定数组当前项下标的变量名
{{idx}}: {{itemName.message}}
2.block wx:for 列表渲染多个组件
渲染一个包含多节点的结构块,wx:for需要应用在
{{index}}:
{{item}}
3.wx:key 指定唯一标识符
如果列表中项目的位置会动态改变或有新的项目添加到列表中,并且希望列表中的项目保持自己的特征和状态,需要使用wx:key 来指定列表中项目的唯一标识符。
wx:key 的值可以两种形式表示:
1.字符串:代表在for循环的array中item的某个属性,该属性的值需要是列表中唯一的字符串或数字,且不能动态改变。
2.保留关键字:*this 代表在for循环中的item本身,这种表示需要item本身是唯一的字符串或数字。当数据改变触发渲染层重新渲染的时候,会校正带有关键字的组件,框架会确保它们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。
{{item.id}}
Page({
data: {
objectArray: [
{id: 5, unique: 'unique_5'},
{id: 4, unique: 'unique_4'},
{id: 3, unique: 'unique_3'},
{id: 2, unique: 'unique_2'},
{id: 1, unique: 'unique_1'},
{id: 0, unique: 'unique_0'},
]
}
}
注意:若不提供wx:key,会提示警告。如果明确知道该列表是静态,或者不必关注其顺序,可以选择忽略。
WXML提供模板(template)功能,允许将一些共用的、复用的代码在模板中定义成代码片段,然后在不同的地方调用,以达到一次编写,多次直接使用的效果。
1.定义模板
在内定义代码片段,使用name属性指定模板的名称
{{index}}: {{msg}}
Time: {{time}}
2.使用模板
在WXML文件中,使用is属性声明需要使用的模板,然后将模板所需要的data传入
Page({
data: {
item: {
index: 0,
msg: 'this is a template',
time: '2016-09-15'
}
}
})
is属性可以使用三元运算语法来动态决定具体需要渲染哪个模板
odd
even
WXML提供import引用和include引用两种文件引用方式。两者的区别在于:import引用模板文件,include引用整个文件(除了)
1.import引用
import可以在当前文件中引用目标文件定义的模板。
#假如在item.wxml 中定义一个叫item的模板
{{text}}
#在index.wxml 中引用item.wxml,就可以使用item模板
2.include引用
include可以将目标文件(除了)的整个代码引入,相当于是复制到include位置
body
header
footer
视图容器组件提供了3种容器组件:view视图容器组件、scroll-view可滚动视图区域组件和swiper滑块视图容器组件。
1.view视图容器组件
view视图容器组件是WXML界面布局的基础组件,它的功能和HTML中的div功能类似,用来进行界面的布局
flex-direction: row
1
2
3
2.scroll-view可滚动视图区域组件
scroll-view可滚动视图区域组件允许视图区域内容横向滚动或者纵向滚动,类似于浏览器的横向滚动条和垂直滚动条
scroll-view
注意:请勿在scroll-view 中使用textarea、map、canvas、video 组件,scroll-into-view 的优先级高于scroll-top,在滚动视图区域时会阻止页面回弹,所以在可滚动视图区域中滚动,是无法触发onPullDownRefresh的。若要使用下拉刷新,需使用页面的滚动功能,而不是scroll-view ,这样也能通过点击顶部状态栏返回到页面顶部。
3.swiper滑块视图容器组件
swiper滑块视图容器组件用来在指定区域内切换内容的显示,常用来制作海报轮播效果和页签内容切换效果
Page({
data:{
indicatorDots:true,
autoplay:true,
interval:5000,
duration:1000,
imgUrls:[
"http://img06.tooopen.com/images/20160818/tooopen_sy_175866434296.jpg", "http://img06.
tooopen.com/images/20160818/tooopen_sy_175833047715.jpg", "http://img02.tooopen.com/images/
20150928/tooopen_sy_143912755726.jpg"
]
}
})
上述代码中,设置autoplay等于true时就可以自动进行海报轮播,设置indicatorDots等于true时代表面板显示指示点,同时可以设置interval(自动切换时长)和duration(滑动动画时长)。
基础内容组件包括icon(图标)组件、text(文本)组件和progress(进度条)组件。
1.icon组件
微信小程序提供了丰富的图标组件,应用于不同的场景,主要有成功、警告、提示、取消、下载等代表不同含义的图标
2.text组件
text组件支持转义符"\",例如换行\n、空格\t。
text组件内只支持
我爱北京\t我爱中国
我爱北京\n我爱中国
3. progress组件
一种提高用户体验度的组件。
就像视频播放一样,可以通过进度条看到完整视频的长度、当前播放的进度,这样能让用户合理地安排自己的时间,提高用户的体验度。
微信小程序提供了丰富的表单组件,包括button(按钮)组件、checkbox(多项选择器)组件、radio(单项选择器)组件、form(表单)组件、input(单行输入框)组件、textarea(多行输入框)组件、label(改进表单可用性)组件、picker(滚动选择器)组件、slider(滑动选择器)组件和switch(开关选择器)组件等。
1.button组件
button组件提供3种类型按钮:基本类型按钮、默认类型按钮和警告类型按钮,同时提供默认和迷你两种大小按钮
2.checkbox组件
用来进行多项选择。
checkbox-group是用来容纳多个checkbox的容器,它有一个绑定事件bindchange。
美国
中国
巴西
日本
英国
3.radio组件
与checkbox对立的一个组件,它每次只能选中一个,选项间是一种互斥关系。
radio-group是用来容纳多个radio的容器,它有一个绑定事件bindchange。
美国
中国
巴西
日本
英国
4.input组件
input用来控制输入单行文本内容。
可以设置input(输入)框的类型为text、number、idcard和digit;
可以设置输入框是否为密码类型,如果是密码类型,则会用点号代替具体值显示;
通过placeholder来给输入框添加友好的提示信息,类似于“请输入手机号/用户名/邮箱”这样友好的提示;
可以设置输入框禁用和最大长度、获取焦点;
该输入框有3个常用的事件:输入时事件(bindinput)、光标聚焦时事件(bindfocus)和光标离开时事件(bindblur)
5.textarea组件
与input对立的一个组件,用来控制输入多行文本内容。
通过placeholder来给输入框添加友好的提示信息,类似于“请输入手机号/用户名/邮箱”这样友好的提示;
可以设置输入框禁用和最大长度、获取焦点、自动调整行高;
该输入框有4个常用的事件:输入时事件(bindinput)、光标聚焦时事件(bindfocus)、光标离开时事件(bindblur)和行数变化时事件(bindlinechange)。
6.label组件
用来改进表单可用性。
目前可以用来改进的组件有button、checkbox、radio和switch。
它只有一个for属性,是用来绑定控件的id。
它的使用有两种方式:一种是没有定义for属性,一种是定义for属性。
1.label组件没有定义for属性
label组件没有定义for属性时,在label内包含、
2.label组件定义for属性
label组件定义for属性后,就会根据for属性的值找到组件id等于for属性值,然后触发相应事件。
7.picker组件
Picker组件支持3种滚动选择器:普通选择器、时间选择器和日期选择器,默认是普通选择器
这3种选择器是通过mode来区分的。例如,普通选择器mode = selector,时间选择器mode =time,日期选择器mode = date。
除了普通选择器、时间选择器和日期选择器3种滚动选择器外,还有一种嵌入页面的滚动选择器(picker-view)。
8.slider组件
常用来控制声音的大小、屏幕的亮度等,
它可以设置滑动步长、显示当前值及设置最小值/最大值
9.switch组件
应用十分普遍,它有两个状态:“开”或“关”。
在很多场景下会用到开关这个功能,例如微信中的新消息提醒界面,它通过开关来设置是否接收消息、是否显示消息、是否有声音、是否震动等功能
10.form组件
用于将表单中组件的值提交给.js进行处理,它可以提交
提交表单的时候,会借助于button组件的formType为submit的属性,将表单组件中的value 值进行提交,并需要在表单组件中加上name 来作为关键字。
单击Reset按钮,可以重置表单;单击Submit按钮,可以把表单数据提交到.js中进行处理。
微信小程序导航组件可以在页面中设置导航,可以使用navigator页面链接组件进行页面跳转
wx.navigateTo保留当前页跳转
wx.redirectTo关闭当前页跳转
wx.switchTab跳转到tabBar页面
媒体组件包括audio(音频)组件、image(图片)组件和video(视频)组件。
audio组件用来播放音乐,image组件用来显示图片,video组件用来播放视频。
1.audio组件
需要有唯一的id,根据id使用wx.createAudioContext('myAudio')创建音频播放的环境;
src属性值为音频播放的资源路径;
poster属性值为音频的播放图片;
name属性值为音频名称。
2.image组件
image组件有两类展现模式:
一类是缩放模式,在缩放模式中包括4种方式;
另一类是裁剪模式,在裁剪模式中包括9种方式。
image
图片
{{item.text}}
Page({
data: {
array: [{
mode: 'scaleToFill',
text: 'scaleToFill:不保持纵横比缩放图片,使图片完全适应’
}, {
mode: 'aspectFit',
text: 'aspectFit:保持纵横比缩放图片,使图片的长边能完全显示出来’
}, {
mode: 'aspectFill',
text: 'aspectFill:保持纵横比缩放图片,只保证图片的短边能完全显示出来’
}, {
mode: 'top',
text: 'top:不缩放图片,只显示图片的顶部区域’
}, {
mode: 'bottom',
text: 'bottom:不缩放图片,只显示图片的底部区域’
}, {
mode: 'center',
text: 'center:不缩放图片,只显示图片的中间区域’
}, {
mode: 'left',
text: 'left:不缩放图片,只显示图片的左边区域’
}, {
mode: 'right',
text: 'right:不缩放图片,只显示图片的右边区域’
}, {
mode: 'top left',
text: 'top left:不缩放图片,只显示图片的左上边区域’
}, {
mode: 'top right',
text: 'top right:不缩放图片,只显示图片的右上边区域’
}, {
mode: 'bottom left',
text: 'bottom left:不缩放图片,只显示图片的左下边区域’
}, {
mode: 'bottom right',
text: 'bottom right:不缩放图片,只显示图片的右下边区域’
}],
src: '../../resources/cat.jpg'
},
imageError: function(e) {
console.log('image3发生error事件,携带值为’, e.detail.errMsg)
}
})
3.video组件
用来播放视频的组件,这个组件可以控制是否显示默认播放控件(播放/暂停按钮、播放进度、时间)及发送弹幕信息等功能;
video组件默认宽度为300px、高度为225px,设置宽高需要通过wxss修改width值和height值
function getRandomColor () {
let rgb = []
for (let i = 0 ; i < 3; ++i){
let color = Math.floor(Math.random() * 256).toString(16)
color = color.length == 1 ? '0' + color : color
rgb.push(color)
}
return '#' + rgb.join('')
}
Page({
onReady: function (res) {
this.videoContext = wx.createVideoContext('myVideo')
},
inputValue: '',
data: {
src: '',
danmuList: [
{
text: ’第 1s 出现的弹幕’,
color: '#ff0000',
time: 1
},
{
text: ’第 3s 出现的弹幕’,
color: '#ff00ff',
time: 3
}]
},
bindInputBlur: function(e) {
this.inputValue = e.detail.value
},
bindButtonTap: function() {
var that = this
wx.chooseVideo({
sourceType: ['album', 'camera'],
maxDuration: 60,
camera: ['front', 'back'],
success: function(res) {
that.setData({
src: res.tempFilePath
})
}
})
},
bindSendDanmu: function () {
this.videoContext.sendDanmu({
text: this.inputValue,
color: getRandomColor()
})
}
})
用来开发与地图有关的应用程序。
在地图上可以标记覆盖物及指定一系列的坐标位置、仓库和客户的收货地址
// map..js
Page({
data: {
markers: [{
iconPath: "/resources/others.png",
id: 0,
latitude: 23.099994,
longitude: 113.324520,
width: 50,
height: 50
}],
polyline: [{
points: [{
longitude: 113.3245211,
latitude: 23.10229
}, {
longitude: 113.324520,
latitude: 23.21229
}],
color:"#FF0000DD",
width: 2,
dottedLine: true
}],
controls: [{
id: 1,
iconPath: '/resources/location.png',
position: {
left: 0,
top: 300 - 50,
width: 50,
height: 50
},
clickable: true
}]
},
regionchange(e) {
console.log(e.type)
},
markertap(e) {
console.log(e.markerId)
},
controltap(e) {
console.log(e.controlId)
}
})
用来绘制正方形、圆形或其他的形状
// canvas..js
Page({
canvasIdErrorCallback: function (e) {
console.error(e.detail.errMsg)
},
onReady: function (e) {
// 使用 wx.createContext 获取绘图上下文 context
var context = wx.createContext()
context.setStrokeStyle("#00ff00")
context.setLineWidth(5)
context.rect(0, 0, 200, 200)
context.stroke()
context.setStrokeStyle("#ff0000")
context.setLineWidth(2)
context.moveTo(160, 100)
context.arc(100, 100, 60, 0, 2 * Math.PI, true)
context.moveTo(140, 100)
context.arc(100, 100, 40, 0, Math.PI, false)
context.moveTo(85, 80)
context.arc(80, 80, 5, 0, 2 * Math.PI, true)
context.moveTo(125, 80)
context.arc(120, 80, 5, 0, 2 * Math.PI, true)
context.stroke()
// 调用 wx.drawCanvas,通过 canvasId 指定在哪张画布上绘制,通过 actions 指定绘制行为
wx.drawCanvas({
canvasId: 'firstCanvas',
actions: context.getActions() // 获取绘图动作数组
})
}
})
用于在页面上显示一个客服会话按钮,用户单击该按钮后会进入客服会话模式。
wx.request是用来请求服务器数据的API,它发起的是HTTPS请求,同时它需要在微信公众平台配置HTTPS服务器域名,一个月内可申请3次修改,否则在由AppID创建的项目中无法使用wx.request请求服务器数据这个API,WebSocket会话、文件上传下载服务器域名都是如此。
Page({
onLoad:function(){
wx.request({
url: 'http://m.maoyan.com/movie/list...json',
data: {
type:'hot',
offset:0,
limit:1000
},
method: 'GET',
success: function(res){
console.log(res);
},
fail: function() {
// fail
},
complete: function() {
// complete
}
})
}
})
若项目没有填写AppID,是可以访问HTTP请求及公众开发平台以外的一些服务器请求,但在手机上是无法预览和使用的,所以学习过程中可以不填写AppID来学习这些API的使用。
API文件上传与下载API是经常会用到的API,可以用来与服务器进行文件的上传与下载
Page({
onLoad:function(){
wx.chooseImage({
count: 9, // 最多可以选择的图片张数,默认9
sizeType: ['original', 'compressed'], // original 原图,compressed 压缩图,默认二者都有
sourceType: ['album', 'camera'], // album 从相册选图,camera 使用相机,默认二者都有
success: function(res){
var tempFilePaths = res.tempFilePaths;
wx.uploadFile({
url: 'http://localhost:8555/wxapp/WxUploadFileServlet',
filePath:tempFilePaths[0],
name:'name',
header: {
'content-type': 'application/..json'
},
formData: {
imgName:’我是图片名称’,
imgSize:'122kb'
},
success: function(res){
console.log(res);
}
})
}
})
}
})
Page({
data:{
src:''
},
onLoad:function(){
var page = this;
wx.downloadFile({
url: "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_
31bdc765.png",
type: 'image', // 下载资源的类型,用于客户端识别处理,有效值:image、audio和video
success: function(res){
console.log(res);
var tempPath = res.tempFilePath;
page.setData({src:tempPath});
}
})
}
})
wx.downloadFile 文件下载最大并发限制量是10个,默认超时和最大超时都是60s,网络请求的referer 是不可设置的,格式固定为https://servicewechat.com/{appid}/{version}/page-frame.html,其中{appid}为小程序的AppID;{version} 为小程序的版本号,版本号0代表开发版。
用来创建一个会话连接,创建会话连接后可以相互通信,例如利用微信聊天和QQ聊天工具进行通信。它会用到以下7个API。
Page({
data:{
msg:'',
sendMsg:[],
socketOpen:false,
resData:[]
},
createConn:function(){
var page = this;
wx.connectSocket({
url: 'ws://localhost:8555/wxapp/getServer',
data:{
x: '',
y: ''
},
header:{
'content-type': 'application/json'
},
method:"GET"
});
wx.onSocketOpen(function(res) {
console.log(res);
page.setData({socketOpen:true});
console.log('WebSocket连接已打开!')
});
wx.onSocketError(function(res){
console.log('WebSocket连接打开失败,请检查!')
})
},
send:function(e){
if (this.data.socketOpen) {
console.log(this.data.socketOpen);
wx.sendSocketMessage({
data:this.data.msg
});
var sendMsg = this.data.sendMsg;
sendMsg.push(this.data.msg);
this.setData({sendMsg:sendMsg});
var page = this;
wx.onSocketMessage(function(res) {
var resData = page.data.resData;
resData.push(res.data);
page.setData({resData:resData});
console.log(resData);
console.log(’收到服务器内容:' + res.data)
})
} else {
console.log('WebSocket连接打开失败,请检查!');
}
},
closeConn:function(e){
wx.closeSocket();
wx.onSocketClose(function(res) {
console.log('WebSocket 已关闭!')
});
},
getMsg:function(e){
var page = this;
page.setData({msg:e.detail.value});
}
})
微信小程序针对图片处理提供3个API:
微信小程序针对文件操作提供5个API:
数据缓存API用来处理数据缓存信息,可以将数据缓存到本地、获取本地缓存数据、移除缓存数据及清理缓存数据,常用的数据缓存API有以下几种。
1.数据缓存到本地
微信小程序提供了两种将数据缓存到本地的方式:
2.获取本地缓存数据
获取本地缓存数据提供了4个API:
前两个API是通过指定key值来获取缓存数据,而后两个是获取当前storage的相关信息。
3.移除和清理本地缓存数据
wx.removeStorage(OBJECT)和wx.removeStorageSync(KEY)用来从本地缓存中移除指定key;
wx.clearStorage()和wx.clearStorageSync()用来清理本地缓存数据。
微信小程序针对位置提供4个API:
微信小程序针对设备应用提供六类API:
wx.getSystemInfo(OBJECT):用来异步获取设备的系统信息
wx.getSystemInfoSync():用于同步获取系统信息,它是没有参数的
使用wx.getNetworkType(OBJECT)来获取网络类型,网络类型分为:2G、3G、4G和WiFi
使用wx.onAccelerometerChange(CALLBACK)来进行重力感应,监听重力感应数据,频率为5次/秒
使用wx.onCompassChange(CALLBACK)来监听罗盘数据,频率为5次/秒
使用wx.makePhoneCall(OBJECT)来拨打电话
使用wx.scanCode(OBJECT)来调出客户端扫码界面,扫码成功后返回对应的结果
微信小程序提供4种交互反馈API:
微信小程序的登录是必不可少的环节,可以简单理解为这样几个步骤。
① 使用wx.login获取code值。
② 获取code值后再加上AppID、secret(公众开发平台AppID下面)、grant_type(授权类型)去请求https://api.weixin.qq.com/sns/.jscode2session这个路径,来获取session_key。
③ 获取session_key后可以生成自己的3rd_session存储在storage中。
④ 后续用户进入微信小程序,先从storage中获得3rd_session,再根据它去查找合法的session_key。
1.wx.login(OBJECT)获取登录凭证
微信小程序使用wx.login(OBJECT)接口来获取登录凭证(code),进而换取用户登录状态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)。用户数据的加解密通信需要依赖会话密钥完成。
2.code 换取session_key
https://api.weixin.qq.com/sns/.jscode2session:这是一个HTTPS 接口,开发者服务器使用登录凭证(code)获取session_key 和openid。
其中session_key 是对用户数据进行加密签名的密钥。
为了应用安全,session_key 不应该在网络上传输。接口地址为:https://api.weixin.qq.com/sns/.jscode2session?appid=APPID&secret=SECRET&.js_code=.JSCODE&grant_type=authorization_code。
3.wx.checkSession(OBJECT) 检查登录状态是否过期
微信小程序可以使用wx.checkSession(OBJECT) 检查登录状态是否过期,如果过期就重新登录
4.wx.getUserInfo(OBJECT) 获取用户信息
微信小程序使用wx.getUserInfo(OBJECT)来获取用户信息。在获取用户信息前,需要调用wx.login接口,只有用户在登录状态,才能获取到用户的相关信息
微信支付主要经过5个步骤:
小程序内调用登录接口、
商户系统调用支付统一下单、
商户系统调用再次签名、
商户系统接收支付通知、
商户系统查询支付结果。
在Page 中定义onShareAppMessage 函数,用来设置该页面的分享信息。只有定义此事件处理函数,右上角菜单才会显示“分享”按钮,用户单击“分享”按钮时会调用。此事件需要返回一个Object,用于自定义分享内容