WXML模板语法

数据绑定

数据绑定的基本原则

  1. 在data中定义数据
  2. 在WXML中使用数据

在data中定义页面数据

在页面对应的js文件中,把数据定义到data对象中即可

1
2
3
4
5
6
7
8
Page({
data:{
// 字符串类型的数据
info:'init data',
// 数组类型的数据
msgList:[{msg:'hello'}, {msg:'world'}]
}
})

Mustache语法的格式

把发他中的数据绑定到页面中渲染,使用Mustache语法(双大括号)将变量包起来即可

1
<view>{{要绑定的数据名称}}</view>

应用场景:

  1. 绑定内容
  2. 绑定属性
  3. 运算(三元运算,算数运算等)

动态绑定内容

页面的数据如下

1
2
3
4
5
Page({
data:{
info:'init data'
}
})

页面的结构如下

1
<view>{{ info }}</view>

动态绑定属性

页面的数据如下

1
2
3
4
5
Page({
data:{
imgSrc:'http://www.itheima.com/images/logo.png'
}
})

页面的结构如下

1
<image src="{{imgSrc}}"></image>

三元运算

页面数据

1
2
3
4
5
Page({
data:{
randomNum: Math.random()*10 //生成10以内的随机数
}
})

页面结构

1
<view>{{ randomNumber >= 5 ? '随机数字大于或等于5' : '随机数字小于5'}}</view>

算数运算

页面数据

1
2
3
4
5
Page({
data:{
randomNum: Math.random().toFixed(2) // 生成一个待两位小数的随机数,如0.34
}
})

页面结构

1
<view>生成100以内的随机数:{{randomNum*100}}</view>

事件绑定

事件概述

事件是渲染层到逻辑层的通讯方式,通过事件可以将用户在渲染层产生的行为,反馈到逻辑层进行业务的处理

小程序中常用事件

类型 绑定方式 事件描述
tap bindtap或 bind:tap 手指触摸后马上离开,类似HTML中click事件
input bindinput或 bind:input 文本框的输入事件
change bindchange或 bind:change 状态改变时触发

事件对象属性

当事件回调触发时,会收到事件对象event,它的详细属性如下

属性 类型 说明
type String 事件类型
timeStamp Integer 页面打开到触发事件时所经过的毫秒数
target Object 触发事件的组件的一些属性值的集合
currentTarget Object 当前组件的一些属性值集合
detail Object 额外的信息
touches Array 触摸事件,当停留在屏幕中的触摸点信息的数组
changedTouches Array 触摸事件,当前变化时触摸点信息的数组

target和currentTarget的区别

target是触发该事件的源头组件,而currentTarget是当前事件所绑定的组件

bindtap的语法格式

小程序中不存在onclick点击事件,而是通过tap事件响应用户的触摸

  1. 通过bindtap,可以为组件绑定tap触摸事件,语法如下

    1
    <button type="primary" bindtap="btnTapHandler">按钮</button>
  2. 在页面中的js文件中定义对应的事件处理函数,事件参数通过形参event(一般简写e)来接收

    1
    2
    3
    4
    5
    6
    Page({
    btnTapHandler(e) { //按钮的tap事件处理函数
    console.log(e) //事件参数对象
    }

    })

在事件处理函数中为data中的数据赋值

通过调用this.setData(dataObject)方法,可以给页面data中的数据重新赋值,示例如下

1
2
3
4
5
6
7
8
9
10
11
12
// 页面的js文件
Page({
data:{
count:0
},
//修改count的值
changeCount() {
this.setData({
count: this.data.count + 1
})
}
})

事件传参

可以为组件data-*自定义属性传参,其中*代表的是参数的名字,示例如下

1
<button bindtap="btnHandler" data-info="{{2}}">事件传参</button>
  • info会被解析为参数的名字
  • 数值2会被解析成参数的值

在事件处理函数中,通过event.target.dataset.参数名即可获取到具体参数的值,示例代码如下

1
2
3
4
5
6
btnHandler(e) {
//dataset是一个对象,包含了所有通过 data-* 传递过来的参数项
console.log(event.target.dataset)
//通过 dataset 可以访问到具体参数的值
console.log(event.target.dataset.info)
}

bindinput的语法格式

在小程序中,通过input事件来响应文本框的输入事件,语法格式如下

  1. 通过bindinput,可以为文本框绑定输入事件

    1
    <input bindinput="inputHandler"></input>
  2. 在页面js文件中定义事件处理函数

    1
    2
    3
    4
    inputHandler(e) {
    // e.detail.value 是变化过后,文本框最新的值
    console.log(e.detail.value)
    }

实现文本框和data之间的数据同步

  1. 定义数据
  2. 渲染结构
  3. 美化样式
  4. 绑定input事件处理函数

渲染结构

1
<input value="{{msg}}" bindinput="iptHandler"></input>

美化样式

1
2
3
4
5
6
input {
border: 1px solid #eee;
padding: 5px;
margin: 5px;
border-radius: 3px;
}

绑定input事件处理函数

1
2
3
4
5
6
7
// 文本框内容改变的事件
iptHandler(e) {
this.setData({
// 通过e.detail.value 获取到文本框最新的值
mag: e.detail.value
})
}

条件渲染

1. wx:if

在小程序中,使用wx:if="{{condition}}"来判断是否需要渲染该代码块

1
<view wx:if="">True</view>

也可以利用wx:elifwx:else来添加else判断

1
2
3
<view wx:if="{{type === 1}}">男</view>
<view wx:elif="{{type === 2}}">女</view>
<view wx:else>保密</view>

2.结合<block>使用 wx:if

如果要一次性控制多个组件的展示与隐藏,可以使用一个<block></block>标签将多个组件包装起来,并在<block>标签上使用wx:if控制属性,示例如下

1
2
3
4
<block>
<view>view1</view>
<view>view2</view>
</block>

<block>并不是一个组件,它只是一个包裹性质的容器,不会在页面中做任何渲染

3.hidden

在小程序中,直接使用hidden="{{condition}}"也能控制元素的显示与隐藏

1
2
3
<view hidden="{{consition}}">
条件为true隐藏,条件为false显示
</view>

4.wx:ifhidden的对比

运行方式不同

  • wx:if以动态创建和移除元素的方式,控制元素的显示与隐藏
  • hidden以切换样式的方式(display:none/block;),控制元素的显示与隐藏

使用建议

  • 频繁切换时,建议使用hidden
  • 控制条件复杂时,建议使用wx:if搭配wx:elif,wx:else进行展示与隐藏的切换

列表渲染

1.wx:for

通过wx:for可以根据指定的数组,循环渲染重复的组件结构,语法示例如下

1
2
3
<view wx:for="{{array}}">
索引是:{{index}} 当前项是:{{item}}
</view>

默认情况下,当前循环项的索引用index表示,当前循环项用item表示

3.手动指定索引和当前项的变量名

  • 使用wx:for-index可以指定当前循环项的索引的变量名
  • 使用wx:for-item可以指定当前项的变量名
1
2
3
<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName">
索引是:{{idx}},当前项是:{{itemName}}
</view>

3.wx:key的使用

类似于Vue列表渲染中的:key,小程序在实现列表渲染时,也建议为渲染出来的列表项指定唯一的key值,从而提高渲染效率

1
2
3
4
5
6
// data数据
data: {
{id:1,name:'小红'},
{id:2,name:'小黄'},
{id:3,name:'小白'}
}
1
2
3
4
// WXML结构
<view wx:for="{{userList}}" wx:key="id">
{{item.name}}
</view>