一、代码演示

未使用wk:key的源码:

//<!--pages/mypage/mypage.wxml-->(wxml页面结构文件)
<switch wx:for = "{{numberArray}}"  style='display : block;'>{{item}}</switch>// pages/mypage/mypage.js(js脚本文件)
Page({/*** 页面的初始数据*/data: {numberArray: [2, 2, 3, 4]},addToFront: function(e) {},addNumberToFront: function(e) {this.data.numberArray = [this.data.numberArray.length + 1].concat(this.data.numberArray)this.setData({numberArray: this.data.numberArray})}})

编译后警告如下:在使用"wx:for"的时候你应该使用"wx:key"属性,这样可以提升效率。

VM1672:3  Now you can provide attr "wx:key" for a "wx:for" to improve performance.6 | </block>7 |
> 8 | <switch wx:for = "{{numberArray}}"  style='display : block;'>{{item}}</switch>|  ^9 | <button bindtap='addNumberToFront'>Add to The Front</button>

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

我的理解:不使用wx:key的情况下, 如果 array 内的数据发生改变,则会重新创建每个Item对象然后渲染列表(费时费力)
使用wx:key的情况下,如果array中的数据发生改变,只是将对应的对象重新排序。未发生变化的对象,不会重新创建(Very good)

作者:Jowney
链接:https://www.jianshu.com/p/e81d29b01fbe
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

二、如何使用

使用情况有两种:
第一种:wk:key="字符串",代表在for循环的array中的item的某个property,该property的值(不是property哦!)需要是列表中唯一的字符串或者或者数字,且不会发生改变。例如:

  objectArray: [{id: 5,name: "Tom"}, {id: 4,name: "Jan"}, {id: 3,name: "Mike"}, {id: 2,name: "Kangkang"}, {id: 1,name: "Meria"}, {id: 0,name: "Luna"}],

在该objectArray中能有唯一性的应该是id,所以应该写成wx:key="id"
代码如下

<!--pages/mypage/mypage.wxml-->
<block><switch wx:for="{{objectArray}}" wx:key="id" style="display : block;">{{item.id}}</switch><button bindtap="randomSort">随机交换数据</button>
</block>// pages/mypage/mypage.js
Page({/*** 页面的初始数据*/data: {objectArray: [{id: 5,name: "Tome"}, {id: 4,name: "Jan"}, {id: 3,name: "Mike"}, {id: 2,name: "Kangkang"}, {id: 1,name: "Meria"}, {id: 0,name: "Luna"}]},randomSort: function(e) {const length = this.data.objectArray.lengthfor (let i = 0; i < length; i++) {const x = Math.floor(Math.random() * length)const y = Math.floor(Math.random() * length)const tmp = this.data.objectArray[x]this.data.objectArray[x] = this.data.objectArray[y]this.data.objectArray[y] = tmp}this.setData({objectArray : this.data.objectArray})}}})

第二种:wk:key="*this",代表在for循环中的item自身,这种表示需要item本身就是一个唯一的字符串或者数字。(偷懒不举例子了)

三、最后

1、如果不提供wx:key,控制台会输出警告,如果明确知道该列表是静态的,可以选择忽视它。
2、我试了一下key的值如果重复的话,程序并不会出现什么异常,但是控制台会输出警告提示你key值重复了。还有第一次渲染的时候就有重复的key值,控制台不会输出警告。
3、就目前来看只要理解wx:key是干什么的,知道怎么用就可以了。

作者:Jowney
链接:https://www.jianshu.com/p/e81d29b01fbe

微信小程序关于wx:key的警告相关推荐

  1. 微信小程序遍历wx:for,wx:for-item,wx:key

    微信小程序中wx:for遍历默认元素为item,但是如果我们设计多层遍历的时候我们就需要自定义item的字段名以及key的键名 wx:for="{{item.goodsList}}" ...

  2. 微信小程序 - 高级 - wx:for 与 wx:for-items 与 wx:key - 1

    前言: 微信小程序的循环实现,通过wx:for 与 wx:for-items 与 wx:key,那么他的主要使用特点是什么呢? 1 wx:for 从目前的例子看,wx:for 的使用确实是对数组来做的 ...

  3. 微信小程序的wx:for和vue的v-for

    写代码的时候,微信小程序的wx:for和vue的v-for,有点搞混了,所以特意举个简单的例子(todos)来区分下. 微信小程序 index.wxml <view class="li ...

  4. 今天微信小程序发现wx.request不好使了,调试报错: 小程序要求的 TLS 版本必须大于等于 1.2...

    今天微信小程序发现wx.request不好使了,调试报错: 小程序要求的 TLS 版本必须大于等于 1.2 查官方文档 解决方法 在 PowerShell中运行以下内容, 然后重启服务器 # Enab ...

  5. 微信小程序的wx.chooseImage如何把图片传给后端

    微信小程序的wx.chooseImage如何把图片传给后端 首选wx.chooseImage的用法先见官方文档 => wx.chooseImage 这个的返回值如下↓ 这里可以看到 这个temp ...

  6. 微信小程序之wx.request:fail错误,真机预览请求无效问题解决,安卓,ios网络预览异常

    微信小程序之wx.request:fail错误,真机预览请求无效问题解决,安卓,ios网络预览异常 参考文章: (1)微信小程序之wx.request:fail错误,真机预览请求无效问题解决,安卓,i ...

  7. 微信小程序使用wx.chooseLocation返回的数据没有省份的处理方法

    微信小程序使用wx.chooseLocation返回的数据没有省份的处理方法 遇到的问题: 第一个坑: 使用wx.chooseLocation获取地址,当输入地址时,有时候第一个搜索结果没有省市区信息 ...

  8. 微信小程序之wx.getLocation再次授权问题解决

    微信小程序之wx.getLocation再次授权问题解决 首先,在page外定义一个公共函数用于发送获取位置的请求 var getLocation = function (that) {wx.getL ...

  9. 微信小程序 通过wx.redirectTo,实现单页面刷新效果 & 下拉刷新页面数据效果

    微信小程序 通过wx.redirectTo,实现单页面刷新效果 & 下拉刷新页面数据效果 一: 使用 wx.redirectTo(),实现页面刷新数据效果 API说明: 关闭当前页面,跳转到应 ...

最新文章

  1. NVIDIA专家实战演示,教你快速搭建基于Python的车辆信息识别系统
  2. WDS系列--Windows Deployment Services概述篇
  3. SpringBoot跨域问题解决方案
  4. en_core_web_sm下载
  5. Jackson将json字符串转换成泛型List
  6. 寄存器分配图着色_【02】从零开始的卡通渲染-着色篇1
  7. 同学聚会 主持词_我主持freeCodeCamp聚会的三年来的成功和失败
  8. 使用jenkins进行Android的持续集成
  9. gedit 可以实现的更多功能插件
  10. mysql子查询更改指定数据库_MySQL数据库update更新子查询
  11. php 多任务,PHP并行多任务研究(笔记)
  12. 维纳滤波(附matlab代码)
  13. 沉痛悼念游戏开发技术专家毛星云
  14. pandas学习手记-柱状图
  15. 智能科普:VR、AR、MR的区别
  16. 期货市场的投资者适当性原则
  17. matlab修复模糊图片论文,图像算法论文,关于运动模糊图像复原算法相关参考文献资料-免费论文范文...
  18. New Empirical Traceability Analysis of CryptoNote-Style Blockchains
  19. 面向开发人员的代码安全指南
  20. 根据一堆数字判定下一个数字_坐在一堆数字黄金

热门文章

  1. RPC 就好像是谈一场异地恋
  2. 技术专栏 | 为什么要基于模型设计?
  3. 7-11 哥德巴赫猜想
  4. fsleyes -- 一款多功能影像数据查看器
  5. golang GC垃圾回收机制
  6. Android的隐私沙盒,与iOS隐私政策有哪些不同?
  7. 开关量无线传输-1主4从
  8. 中关村企业 大数据_中关村大数据企业产业规模年均增长20%以上
  9. 用python把学习通导出成绩,未完善
  10. 引流复盘:从知乎引流20万粉,我只用了1个月