说明文档:https://developers.weixin.qq.com/miniprogram/dev/reference/wxml/
数据绑定
将data
中的数据渲染到页面中需要使用{{}}
包裹
<!--wxml-->
<view> {{message}} </view>
// page.js
Page({
data: {
message: 'Hello MINA!'
}
})
动态属性:
<!--wxml-->
<image src="{{ imgSrc }}"></view>
// page.js
Page({
data: {
imgSrc: '...png'
}
})
条件渲染
在小程序中使用wx:if="{{ condition }}"
来判断是否需要渲染改代码块,也可以使用wx:elif
和wx:else
来添加else
的判读。
<view wx:if="{{ type === 1 }}">男</view>
<view wx:elif="{{ type === 2 }}">女</view>
<view wx:else>保密</view>
Page({
data: {
type: 2
}
})
如果想要一次性控制多个组件的展示和隐藏,需要使用一个<block></block>
标签将组件进行包裹,并在block
上使用wx:if
控制属性。**block**
并不是一个组件,只是一个包裹性质的容器,不会再页面上做任何渲染。
<block wx:if="{{ true }}">
<view>view1</view>
<view>view2</view>
</block>>
hidden
的使用:
在小程序中直接使用hidden="{{ condition }}"
也能控制元素的显示和隐藏。
<view hidden="{{ flag }}">这是一个hiddenview</view>
Page({
data: {
flag: true
}
})
wx:if
和hiddent
的对比:
1、运行方式不同wx:if
是动态的方式创建和移除元素的方式;hidden
是切换样式的方式(display: none
)
2、使用场景
当频繁切换的显示隐藏时候使用hidden
控制条件比较复杂的时候使用wx:if
、wx:elif
和wx:else
列表渲染
使用wx:for
可以循环渲染,默认情况下,index
表示循环的索引,item
表示循环的项
数据循环的时候需要指定一个key
值。
<view wx:for="{{list}}" wx:key="index">
{{ index }} {{ item }}
</view>
Page({
data: {
list: ["苹果", "香蕉", "葡萄"]
}
})
使用wx:for-index
可以为index
进行重命名,使用wx:for-item
可以为item
进行重命名
<view wx:for="{{list}}" wx:key="index" wx:for-index="ind" wx:for-item="ite">
{{ ind }} = {{ ite }}
</view>
事件绑定
事件是渲染层到逻辑层的通讯方式。
通过事件可以将用户在渲染层产生的行为,反馈到逻辑层进行业务的处理。
小程序常用的事件:
类型 | 绑定方式 | 事件描述 |
---|---|---|
tap |
bindtap 或者bind:tap |
手指触摸后马上离开,类似HTML 的点击事件 |
input |
bindinput 或者bind:input |
文本框输入事件 |
change |
bindchange 或者bind:change |
状态改变事件 |
事件对象:
当事件触发的时候,会收到一个事件对象evnet
type | 事件类型 |
---|---|
timeStamp | 页面打开到触发事件所经过的毫秒数 |
target | 触发睡觉的组件的一些属性值集合 |
currentTarget | 当前组件的一些属性值集合 |
detail | 额外的信息 |
touches | 触摸事件,当前停留在屏幕中的触摸点信息的数组 |
changedTouches | 触摸事件,当前变化的触摸点信息的数组 |
{
"type":"tap",
"timeStamp":895,
"target": {
"id": "tapTest",
"dataset": {
"hi":"Weixin"
}
},
"currentTarget": {
"id": "tapTest",
"dataset": {
"hi":"Weixin"
}
},
"detail": {
"x":53,
"y":14
},
"touches":[{
"identifier":0,
"pageX":53,
"pageY":14,
"clientX":53,
"clientY":14
}],
"changedTouches":[{
"identifier":0,
"pageX":53,
"pageY":14,
"clientX":53,
"clientY":14
}]
}
target
和currentTarnet
的区别:target
是触发事件的源头组件,而currentTarget
是当前事件所绑定的组件。
bindtap
的语法格式:
小程序中不存在click
事件,而是通过tap
事件来响应用户的触摸行为。
1、通过bindtap
为组件绑定触摸事件
2、然后在js
文化中定义事件处理函数
<button type="primary" bindtap="handleTapBtn">点击按钮</button>
Page({
/**
* 页面的初始数据
*/
data: {
msg: "Hello World"
},
/**
* 处理点击按钮事件
* */
handleTapBtn(event) {
console.log(event)
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
// ...
})
如何更改页面中data
数据:
调用this.setData(dataObject)
方法可以更改data
里面的数据。
Page({
/**
* 页面的初始数据
*/
data: {
msg: "Hello World",
count: 0
},
/**
* 处理点击按钮事件
* */
handleTapBtn(event) {
console.log(event)
this.setData({
count: this.data.count + 1
})
}
// ...
})
事件传参:
小程序的事件传参比较特殊,不能在绑定事件的同事为事件处理函数传递参数。
需要通过data-*
自定义属性传参,然后通过event.target.datase
获取参数
<button type="primary" data-info="this is btn" bindtap="handleTapBtn">点击按钮</button>
Page({
/**
* 页面的初始数据
*/
data: {
msg: "Hello World",
count: 0
},
/**
* 处理点击按钮事件
* */
handleTapBtn(event) {
console.log(event.target.dataset); // {info: "this is btn"}
},
// ...
})
bindinput
的语法格式:input
用来处理文本框输入事件。
<input bindinput="handleInput"></input>
Page({
/**
* 页面的初始数据
*/
data: {
msg: "Hello World",
count: 0
},
handleInput(event) {
console.log(event.detail.value)
},
// ...
})
双向绑定
<input model:value="{{ inputValue }}" ></input>