说明文档:https://developers.weixin.qq.com/miniprogram/dev/reference/wxml/

数据绑定

data中的数据渲染到页面中需要使用{{}}包裹

  1. <!--wxml-->
  2. <view> {{message}} </view>
  1. // page.js
  2. Page({
  3. data: {
  4. message: 'Hello MINA!'
  5. }
  6. })

动态属性:

  1. <!--wxml-->
  2. <image src="{{ imgSrc }}"></view>
  1. // page.js
  2. Page({
  3. data: {
  4. imgSrc: '...png'
  5. }
  6. })

条件渲染

在小程序中使用wx:if="{{ condition }}"来判断是否需要渲染改代码块,也可以使用wx:elifwx:else来添加else的判读。

  1. <view wx:if="{{ type === 1 }}"></view>
  2. <view wx:elif="{{ type === 2 }}"></view>
  3. <view wx:else>保密</view>
  1. Page({
  2. data: {
  3. type: 2
  4. }
  5. })

如果想要一次性控制多个组件的展示和隐藏,需要使用一个<block></block>标签将组件进行包裹,并在block上使用wx:if控制属性。
**block**并不是一个组件,只是一个包裹性质的容器,不会再页面上做任何渲染。

  1. <block wx:if="{{ true }}">
  2. <view>view1</view>
  3. <view>view2</view>
  4. </block>>

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

  1. <view hidden="{{ flag }}">这是一个hiddenview</view>
  1. Page({
  2. data: {
  3. flag: true
  4. }
  5. })

wx:ifhiddent的对比:
1、运行方式不同
wx:if是动态的方式创建和移除元素的方式;hidden是切换样式的方式(display: none
2、使用场景
当频繁切换的显示隐藏时候使用hidden
控制条件比较复杂的时候使用wx:ifwx:elifwx:else

列表渲染

使用wx:for可以循环渲染,默认情况下,index表示循环的索引,item表示循环的项
数据循环的时候需要指定一个key值。

  1. <view wx:for="{{list}}" wx:key="index">
  2. {{ index }} {{ item }}
  3. </view>
  1. Page({
  2. data: {
  3. list: ["苹果", "香蕉", "葡萄"]
  4. }
  5. })

使用wx:for-index可以为index进行重命名,使用wx:for-item可以为item进行重命名

  1. <view wx:for="{{list}}" wx:key="index" wx:for-index="ind" wx:for-item="ite">
  2. {{ ind }} = {{ ite }}
  3. </view>

事件绑定

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

小程序常用的事件:

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

事件对象:
当事件触发的时候,会收到一个事件对象evnet

type 事件类型
timeStamp 页面打开到触发事件所经过的毫秒数
target 触发睡觉的组件的一些属性值集合
currentTarget 当前组件的一些属性值集合
detail 额外的信息
touches 触摸事件,当前停留在屏幕中的触摸点信息的数组
changedTouches 触摸事件,当前变化的触摸点信息的数组
  1. {
  2. "type":"tap",
  3. "timeStamp":895,
  4. "target": {
  5. "id": "tapTest",
  6. "dataset": {
  7. "hi":"Weixin"
  8. }
  9. },
  10. "currentTarget": {
  11. "id": "tapTest",
  12. "dataset": {
  13. "hi":"Weixin"
  14. }
  15. },
  16. "detail": {
  17. "x":53,
  18. "y":14
  19. },
  20. "touches":[{
  21. "identifier":0,
  22. "pageX":53,
  23. "pageY":14,
  24. "clientX":53,
  25. "clientY":14
  26. }],
  27. "changedTouches":[{
  28. "identifier":0,
  29. "pageX":53,
  30. "pageY":14,
  31. "clientX":53,
  32. "clientY":14
  33. }]
  34. }

targetcurrentTarnet的区别:
target是触发事件的源头组件,而currentTarget是当前事件所绑定的组件。
image.png

bindtap的语法格式:
小程序中不存在click事件,而是通过tap事件来响应用户的触摸行为。
1、通过bindtap为组件绑定触摸事件
2、然后在js文化中定义事件处理函数

  1. <button type="primary" bindtap="handleTapBtn">点击按钮</button>
  1. Page({
  2. /**
  3. * 页面的初始数据
  4. */
  5. data: {
  6. msg: "Hello World"
  7. },
  8. /**
  9. * 处理点击按钮事件
  10. * */
  11. handleTapBtn(event) {
  12. console.log(event)
  13. },
  14. /**
  15. * 生命周期函数--监听页面加载
  16. */
  17. onLoad(options) {
  18. },
  19. // ...
  20. })

如何更改页面中data数据:
调用this.setData(dataObject)方法可以更改data里面的数据。

  1. Page({
  2. /**
  3. * 页面的初始数据
  4. */
  5. data: {
  6. msg: "Hello World",
  7. count: 0
  8. },
  9. /**
  10. * 处理点击按钮事件
  11. * */
  12. handleTapBtn(event) {
  13. console.log(event)
  14. this.setData({
  15. count: this.data.count + 1
  16. })
  17. }
  18. // ...
  19. })

事件传参:
小程序的事件传参比较特殊,不能在绑定事件的同事为事件处理函数传递参数。
需要通过data-*自定义属性传参,然后通过event.target.datase获取参数

  1. <button type="primary" data-info="this is btn" bindtap="handleTapBtn">点击按钮</button>
  1. Page({
  2. /**
  3. * 页面的初始数据
  4. */
  5. data: {
  6. msg: "Hello World",
  7. count: 0
  8. },
  9. /**
  10. * 处理点击按钮事件
  11. * */
  12. handleTapBtn(event) {
  13. console.log(event.target.dataset); // {info: "this is btn"}
  14. },
  15. // ...
  16. })

bindinput的语法格式:
input用来处理文本框输入事件。

  1. <input bindinput="handleInput"></input>
  1. Page({
  2. /**
  3. * 页面的初始数据
  4. */
  5. data: {
  6. msg: "Hello World",
  7. count: 0
  8. },
  9. handleInput(event) {
  10. console.log(event.detail.value)
  11. },
  12. // ...
  13. })

双向绑定

文档:
简易双向绑定 | 微信开放文档

  1. <input model:value="{{ inputValue }}" ></input>