微信小程序: wx:key详解

一、代码演示

未使用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)

二、如何使用

使用情况有两种:
第一种:wk:key="字符串",代表在for循环的array中的item的某个属性名称(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是干什么的,知道怎么用就可以了

微信小程序: wx:key详解相关推荐

  1. 微信小程序详解 php,微信小程序列表开发详解

    本文主要和大家分享微信小程序列表开发详解,主要以代码的形式和大家分享,希望能帮助到大家. 一.知识点 (一).列表渲染 wx:for tip:wx:for="array"可以等于参 ...

  2. 小程序向Java传值,微信小程序 页面传值详解

    微信小程序 页面传值详解 一. 跨页面传值. 1 . 用 navigator标签传值或 wx.navigator, 比如 这里将good_id=16 参数传入detail页面, 然后detail页面的 ...

  3. 微信小程序详解 php,微信小程序canvas基础详解

    canvas 元素用于在网页上绘制图形.HTML5 的 canvas 元素使用 JavaScript 在网页上绘制2D图像.本文主要和大家分享微信小程序canvas基础详解,希望能帮助到大家. 一.了 ...

  4. php 微信小程序 循环 多选,微信小程序 for 循环详解

    1,wx:for 在组件上使用wx:for控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件.默认数组的当前项的下标变量名默认为index,数组当前项的变量名默认为item 事例如下: wx ...

  5. php小程序地图处理,微信小程序 地图map详解及简单实例

    微信小程序 地图map 微信小程序map 地图属性名类型默认值说明longitudeNumber中心经度 latitudeNumber中心纬度 scaleNumber1缩放级别 markersArra ...

  6. 微信小程序底部菜单详解

    微信小程序底部菜单详解 只需要在app.json里面修改配置,即可 {"pages":["pages/index/index","pages/logs ...

  7. 【迷宫】地下迷宫游戏-微信小程序开发流程详解

    可曾记得,小时候上学路边买的透明铅笔盒,里面内嵌了一个小球,它用重力可从起点滚动到终点,对小朋友来说是感觉有趣的,在这个游戏的基础上,弄一款微信小程序的迷宫探索游戏试试,在不同关卡的迷宫中解开机关与谜 ...

  8. 微信小程序----手势锁详解

    设计思路流程图 1.全局常量 constructor(page,opts){// 初始化全局常量数据this.page = page;this.width = opts.width || 300;th ...

  9. 微信小程序退款功能(详解完整)

    微信小程序支付->退款 微信小程序退款的时候如果是线上,就会涉及到Linux读取打包后项目存放文件路径失败问题,获取不到其中的微信退款证书,在这里就需要使用流的方式进行读取路径,经大佬指点才最终 ...

  10. 上传声音 微信小程序_图文详解微信小程序中调用录音功能和音频播放的方法...

    老规矩,先几张图. 1.为了进来看得清楚.刚开始没有加载音频列表.代码往前挪一挪即可. 2.按住 录音按钮的时候会出现麦克风.中间的麦克风是个帧动画. 其实就是用js控制图片显示隐藏.没啥好说的.这里 ...

最新文章

  1. 一个线程池中的线程异常了,那么线程池会怎么处理这个线程?
  2. python中读取文件内容-Python读取文件内容的三种常用方式及效率比较
  3. Spring与Hibernate两种组合方式
  4. 批量修改nginx配置文件
  5. 初识Android四大组件之一Activity(活动)
  6. 第五模块·WEB开发基础-第2章JavaScript基础
  7. mysql 多字节编码漏洞_phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)
  8. mysql导入数据库注释乱码_source命令 导入.sql文件时,中文乱码 或者是注释乱码...
  9. HTML鼠标点击文字语音播放,10款jQuery+HTML5实现的鼠标点 经过播放音频
  10. C#LeetCode刷题之#190-颠倒二进制位(Reverse Bits)
  11. php post修改字段,单个{customposttype}.php中的函数wp_insert_post()清除自定义字段
  12. C#泛型编程基础知识总结【转】
  13. 关于kgm文件的解码
  14. iOS中3DTouch的使用
  15. 国际学校入学考试MAP语法测试题真题讲解
  16. 企业邮箱哪家最优惠?企业邮箱最优惠价格来了
  17. 有效的括号长按键入验证外星语词典字符的最短距离用栈实现队列
  18. 【运动控制】运动控制卡与PLC的区别
  19. Linux中Uboot详解
  20. JAVAweb连接不上数据库原因及解决办法

热门文章

  1. c# 3D图形处理库
  2. 对飞猪H5端API接口sign签名逆向实验
  3. STM32小车篇之超声波测距
  4. 20条常用微信沟通技巧,微信聊天必备
  5. Chromium下载地址
  6. Android 获取手机型号,版本号等。
  7. NLP中的主题模型理解
  8. TrueCrypt安装及其使用教程
  9. 你怎么保存微博中喜欢的视频
  10. 在线CHM阅读器(2)——文件提取及关键文件解析