微信小程序-WXML列表渲染Key

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

wx:key

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


wx:key 的值以两种形式提供:

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


?> 底层原理:小程序内部也使用了虚拟DOM(和Vue,React相似),通过key可以更好更快的判断是否可以复用


首先来看一个不使用wx:key的情况下,我们的示例会出现什么意想不到的情况,我们现在index.js定义一个属性来存储一些数据,然后编写一个方法用来给index.wxml页面按钮点击事件使用:


index.js:

data: {
  chs: ['a', 'b', 'c']
},
_myClickHandle: function(){
  console.log("加之前:" + this.data.chs)
  this.data.chs.push('d');
  this.setData(this.data);
  console.log("加之后:" + this.data.chs)
},


index.wxml:

<view wx:for="{{ chs }}">
  <switch/>
  <text>{{ item }}</text>
</view>
<button bindtap="_myClickHandle">按钮</button>


这个实例看起来一切正常,我们是往数组的后面追加元素的,我们来改造成往前面进行添加元素,更改一下_myClickHandle方法的追加方式从 push 改为 unshift:

this.data.chs.unshift('d');


再次运行我们的程序结果如下:

image.gif


发现我们新增的元素的开关状态自动被打开了,这个时候就出现了很严重的问题。


出现问题的原因:

2105804-20230409115444598-460046546.png

正是因为如此,就有了wx:key这么一个东西来解决该问题。


wx:key 官方文档:https://developers.weixin.qq.com/miniprogram/dev/reference/wxml/list.html#wx-key


到了这里我们就知道了如果不用wx:key那么就会出现复用DOM出错的情况,那么我们就来使用下,经过上面的一帆介绍我们知道了有两种wx:key的使用方式我们先来看,保留关键字。


保留关键字

2105804-20230409115837840-2085559031.png

如果上图的效果很显然,我们的问题已经得到了解决,那么为啥添加了wx:key那么就不会导致我们新增的元素复用错误呢,我画了张图看下图:

2105804-20230409115919752-468834029.png

好了,通过上图我们可以很清楚的看明白,我们的新增元素在复用组件当中找不到所以会重新创建一个新的。


如果列表渲染出来的数据不会发生变化,那么添加不添加wx:key都无所谓,但是还是建议添加,如果列表渲染出来的数据会发生变化,那么必须添加wx:key保证数据状态的正确性。


*this:表示当前遍历到的元素,也就是item中存储的内容,如果是独一无二的简单类型数据,可以使用 *this 但是如果是复杂类型(对象/数组), 不能使用*this。因为给到的结构是[object object] 无法保证唯一。


字符串

关于字符串的wx:key这里就简单弄个数据结构进行渲染即可:


index.js:

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'},
],


index.wxml:

<view wx:for="{{ objectArray }}" wx:key="id">
  <text>{{ item.unique }}</text>
</view>


wx:key=“id” 表示从当前遍历到的数组中获取id的值,item -> object -> item.id

目录
相关文章
|
7月前
|
JSON 小程序 前端开发
towxml的使用,在微信小程序中快速将markdown格式渲染为wxml文本
本文介绍了在微信小程序中使用`towxml`库将Markdown格式文本渲染为WXML的方法。文章提供了`towxml`的概述、安装步骤、以及如何在小程序中配置和使用`towxml`进行Markdown解析的详细说明和代码示例。
|
7月前
|
小程序 前端开发 索引
微信小程序中的条件渲染和列表渲染,wx:if ,wx:elif,wx:else,wx:for,wx:key的使用,以及block标记和hidden属性的说明
这篇文章介绍了微信小程序中条件渲染和列表渲染的使用方法,包括wx:if、wx:elif、wx:else、wx:for、wx:key以及block标记和hidden属性的使用。
微信小程序中的条件渲染和列表渲染,wx:if ,wx:elif,wx:else,wx:for,wx:key的使用,以及block标记和hidden属性的说明
|
9月前
|
小程序 开发者
【微信小程序】 微信小程序报错不在以下request合法域名列表中
【微信小程序】 微信小程序报错不在以下request合法域名列表中
1330 0
|
9月前
|
小程序
【微信小程序-原生开发】列表 - 拖拽排序(官方组件 movable-area 和 movable-view 的用法)
【微信小程序-原生开发】列表 - 拖拽排序(官方组件 movable-area 和 movable-view 的用法)
709 0
|
18天前
|
小程序 Java 关系型数据库
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
|
18天前
|
小程序 关系型数据库 Java
weixin168“返家乡”高校暑期社会实践微信小程序设计与开发ssm(文档+源码)_kaic
本文探讨高校暑期社会实践微信小程序的开发与应用,旨在通过信息化手段提升活动管理效率。借助微信小程序技术、SSM框架及MySQL数据库,实现信息共享、流程规范和操作便捷。系统涵盖需求分析、可行性研究、设计实现等环节,确保技术可行、操作简便且经济合理。最终,该小程序可优化活动发布、学生信息管理和心得交流等功能,降低管理成本并提高工作效率。
|
1月前
|
人工智能 自然语言处理 小程序
技术小白如何利用DeepSeek半小时开发微信小程序?
通过通义灵码的“AI程序员”功能,即使没有编程基础也能轻松创建小程序或网页。借助DeepSeek V3和R1满血版模型,用户只需用自然语言描述需求,就能自动生成代码并优化程序。例如,一个文科生仅通过描述需求就成功开发了一款记录日常活动的微信小程序。此外,通义灵码还提供智能问答模式,帮助用户解决开发中的各种问题,极大简化了开发流程,让普通人的开发体验更加顺畅。
877 11
技术小白如何利用DeepSeek半小时开发微信小程序?
|
1月前
|
小程序 JavaScript 前端开发
微信小程序开发全流程:从注册到上线的完整指南
这篇文章详细记录了微信小程序的完整开发到最终上线的每一个步骤。适合对小程序开发感兴趣的个人开发者或希望了解完整流程的学习者,涵盖了云开发、事件绑定、生命周期管理、组件使用等关键内容。
232 11
|
6月前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
1468 7
|
6月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
1119 1

热门文章

最新文章