教程接上篇,当需要展示一组数据时,可以使用wx:for

//.wxml
<view wx:for="{{array}}">{{index}}: {{item.message}}
</view>//.js
age({data: {array: [{message: 'foo',}, {message: 'bar'}]}
})

其中index是当前数据索引的默认变量名,item是当前数据项的默认变量名。
也可以使用 wx:for-itemwx:for-index 来指定别名

<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName">{{idx}}: {{itemName.message}}
</view>

也可以嵌套使用,如下面是一个九九乘法表

<view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="i"><view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="j"><view wx:if="{{i <= j}}">{{i}} * {{j}} = {{i * j}}</view></view>
</view>

类似block wx:if,也可以将wx:for用在<block/>标签上,以渲染一个包含多节点的结构块

<block wx:for="{{[1, 2, 3]}}"><view> {{index}}: </view><view> {{item}} </view>
</block>

wx:key

要理解为什么需要wx:key,先来看一个例子:

//.wxml
<checkbox wx:for="{{objectArray}}" value="{{item.name}}" style="display: block;"> {{item.name}} </checkbox>
<button bindtap="addToFront">在上方添加一个新的check组件</button>//.js
Page({data: {objectArray: [{id: 1, name: '我没有被选中'},{id: 2, name: '我没有被选中'},],},addToFront: function(e) {const length = this.data.objectArray.lengththis.data.objectArray = [{id: length, name: '我没有被选中'}].concat(this.data.objectArray)this.setData({objectArray: this.data.objectArray})},
})

上面的代码创建了两个checkbox组件和一个按钮,当点击按钮会在最上方新增一个checkbox组件。
编译代码,会显示如下界面:

点击按钮,界面如下:

ok,到这里一切正常 ,为了更好的说明问题,加入checkbox选中事件的处理,当checkbox被选中时,将文字修改为"我被选中了",相关代码如下:

//wxml
<checkbox-group bindchange="checkboxChange"><checkbox wx:for="{{objectArray}}" value="{{item.id}}" style="display: block;" > {{item.name}} </checkbox>
</checkbox-group><button bindtap="addToFront">在上方添加一个新的check组件</button>//js
Page({data: {objectArray: [{id: 1, name: '我没有被选中'},{id: 2, name: '我没有被选中'},],},addToFront: function(e) {const length = this.data.objectArray.lengththis.data.objectArray = [{id: length + 1, name: '我没有被选中'}].concat(this.data.objectArray)this.setData({objectArray: this.data.objectArray})},checkboxChange: function(e){console.log('checkboxChange')const length = this.data.objectArray.lengthlet checkBoxArray = this.data.objectArrayfor (let i = 0; i < length; i++) {let ischecked = falsefor (let j = 0; j < e.detail.value.length; j++){if (checkBoxArray[i].id == e.detail.value[j]){checkBoxArray[i].name = '我被选中了'ischecked = true}}if (!ischecked){checkBoxArray[i].name = '我没有被选中'}}this.setData({objectArray: this.data.objectArray})}
})

当选中第一个checkbox时,界面如下

这时如果点击添加组件按钮会怎样呢,期望的效果应该如下

然而实际效果确是下图这样的

可以看到渲染引擎并没有将选中的效果和数据绑定起来,导致出现了预期之外的结果。如果想要达到预期效果,就要使用wx:key

<checkbox-group bindchange="checkboxChange"><checkbox wx:for="{{objectArray}}" wx:key = "id" value="{{item.id}}" style="display: block;" > {{item.name}} </checkbox>
</checkbox-group><button bindtap="addToFront">在上方添加一个新的check组件</button>

将.wxml文件修改为上述代码所示,就可以实现预期效果,重点就在 wx:key = "id" 这一句

如果列表中项目的位置会动态改变或者有新的项目添加到列表中,并且希望列表中的项目保持自己的特征和状态(如 <input/>
中的输入内容,<switch/> 的选中状态),需要使用 wx:key 来指定列表中项目的唯一的标识符。

wx:key 的值以两种形式提供
1 字符串,代表在 for 循环的 array 中 item 的某个 property,该 property的值需要是列表中唯一的字符串或数字,且不能动态改变。
2 保留关键字 *this 代表在 for 循环中的 item 本身,这种表示需要item 本身是一个唯一的字符串或者数字,

上面引用自微信官方教程。除了用于保持视图组件的状态外,使用wx:key还有助于提高渲染效率

当数据改变触发渲染层重新渲染的时候,会校正带有 key的组件,框架会确保他们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。

微信小程序开发教程(基础篇)8-数据绑定下相关推荐

  1. 【helloworld】-微信小程序开发教程-入门篇【1】

    1. 开篇导言 本节目标:旨在演示如何用开发者工具构建并运行简单的 helloworld 应用. 目标用户:无编程经验,但对微信小程序感兴趣的同学. 学习目标:开发者工具的基本使用流程,即创建.导入. ...

  2. 微信小程序开发笔记 基础篇②——微信小程序 手动查看和代码查看开发者ID(AppID)

    文章目录 一.手动查看 二.代码查看 一.手动查看 微信小程序后台 开发管理-->开发设置-->开发者ID 二.代码查看 app.js onLaunch(opts) {const acco ...

  3. 视频教程-微信小程序开发教程(第1篇)-微信开发

    微信小程序开发教程(第1篇) 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信息系统项 ...

  4. 微信小程序开发笔记 进阶篇⑤——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之前)

    文章目录 一.前言 二.前端代码wxml 三.前端代码js 四.后端java 五.程序流程 六.参考 一.前言 微信小程序开发笔记--导读 大部分微信小程序开发者都会有这样的需求:获取小程序用户的手机 ...

  5. 零基础入门,花生壳骨灰级微信小程序开发教程

    微信小程序早已成为企业运营必不可少的一部分,对于小程序的开发需求也只增不减,而一个小程序在使用过程中是否流畅,也关系者用户体验度. 微信小程序的优势和特点: 一.不占内存 现在很多人都会遇到手机内存不 ...

  6. 微信小程序开发笔记 进阶篇⑥——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之后)

    文章目录 一.前言 二.前端代码wxml 三.前端代码js 四.后端java 五.程序流程 六.参考 一.前言 微信小程序开发笔记--导读 大部分微信小程序开发者都会有这样的需求:获取小程序用户的手机 ...

  7. 微信小程序开发教程:项目二微信小程序开发基础 课后习题

    <微信小程序开发教程>主编/黄寿孟 易芳 陶延涛 湖南大学出版社 目录 一.单选题 二.多选题 三.判断题 四.填空题 五.简答题 1.请简单描述页面样式的单位rpx与px的关系. 2.简 ...

  8. 微信小程序开发分销制度济南_花店微信小程序开发教程

    如何将自己的鲜花商品快速配送出去,避免鲜花过期浪费,是很多传统花店商家的难题.不过随着微信小程序的出现,这一难题也渐渐得到了解决.花店商家可以通过自己的小程序商城,打通线上渠道,可以加大推广.扩大销量 ...

  9. 微信小程序开发教程第七章:微信小程序编辑名片页面开发

    前面我们更新了六篇的微信小程序开发教程,现在更新第七章:微信小程序编辑名片页面开发,(第一二章:微信小程序开发教程,第三四章:微信小程序项目结构以及配置&微信小程序首页面开发,第五章:微信小程 ...

最新文章

  1. android 动态 dex,Android 动态加载dex
  2. 【 FPGA 】设置伪路径
  3. android下载源代码
  4. (转)探究 TCP 一次数据包最大负载,上限真的是 65495 byte 吗
  5. AjaxPro排错指南
  6. mysql直接执行文件格式_Windows 环境下执行 .sql 格式文件方式
  7. mybatis学习(32):删除操作
  8. 计算机注销命令,Win7使用DOS命令实现定时自动关机,注销、重启的方法
  9. mysql数据库访问组件_mysql数据库访问组件
  10. Ubuntu 16.04 软件安装
  11. 11. 配置ZooKeeper ensemble
  12. python xml转字典_python xml转成dict
  13. 监控视频中人的特征识别
  14. Ubuntu 20.04 安装多个版本 php 并应用到 nginx
  15. catv系统主要有哪三部分组成_光纤通信系统的组成与特点
  16. NetSetMan Pro(ip快速切换工具)官方中文版V5.1.0 | 电脑ip切换软件下载
  17. 电脑上怎么安装c语言编程软件,如何在自己的电脑上安装C语言运行的环境?
  18. C#实现检测打印机状态(包括打印机是否缺纸、打印队列任务数)
  19. 访问php网页显示源代码_关于PHP中获取网页源代码的说明
  20. 过支付宝反Xposed登录检测

热门文章

  1. OpenCV iOS-视频处理
  2. C语言字符串是否为pallindrome排列的算法(附完整源码)
  3. OpenGL indirect material间接材料的实例
  4. C++Pascal‘s Triangle杨辉三角的实现算法
  5. 经典C语言程序100例之五七
  6. c语言常用二个标准库函数
  7. C++中什么时候用new[]申请,可以用delete释放
  8. uml和模式应用 pdf_总结分享:PHP中常见的五种设计模式
  9. 客户服务器结构的数据库系统,客户服务器结构的数据库的例子
  10. 「JupyterNotebook」Jupyter快捷键个人笔记