zoukankan      html  css  js  c++  java
  • 微信小程序 wx:key

    微信小程序 wx:key

    在实际开发过程中遇到 warning: Now you can provide attr "wx:key" for a "wx:for" to improve performance.

    官方解释:

    wx:key

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

    网上资料:

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

    1、wx:key="property" 其中property是代表在 for 循环的 array 中 item 的某个 property,该 property 的值需要是列表中唯一的字符串或数字,且不能动态改变。类似于字典的key值

    2、wx:key="*this", 保留关键字 *this 代表在 for 循环中的 item 本身,这种表示需要 item 本身是一个唯一的字符串或者数字,如:

    当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,框架会确保他们被重新排序,而不是重新创建,以确保使组

    件保持自身的状态,并且提高列表渲染时的效率。 

    不添加wx:key情况:

    <block wx:for-items="{{userInfoList}}" >,会出现warning: Now you can provide attr "wx:key" for a "wx:for" to improve performance. 如果明确知道该列表是静态,或者不必关注其顺序,可以选择忽略。推荐array 的 每一个item都添加一个唯一识别的property来管理,这样就可以去掉warning,如果使用保留关键字,好像会出现显示的item都是最后一个的

    <block wx:for-items="{{userInfoList}}" wx:key="userInfoListId">

    • 如果不加 wx:key, 在 setData 之后,如果 array 内的数据如果发生改变,会重新创建前端的渲染对象
    • 加上 wx:key,重新渲染时,只是将对应的对象重新排序。未发生变化的对象,不会重新创建

    参考官方的解释

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

    需要验证的问题

     

    加上 wx:key 之后,会根据给定的 key 进行排序么?

    写个简单的测试页面

    <block wx:for="{{languages}}" wx:for-item="language" wx:key="id">
      <text class="log-item">{{ language.id }} . {{ language.name }}</text>
    </block>
    
    data: {
      languages: [
        {id: 1, name: 'php'},
        {id: 4, name: 'javascript'},
        {id: 3, name: 'golang'},
        {id: 2, name: 'python'},
        {id: 5, name: 'java'},
      ],
    },
    

    微信小程序 wx:key 测试结果

    从测试结果来看,并不会影响到排序。

    key 重名时是否会报错

    data: {
      languages: [
        {id: 1, name: 'php'},
        {id: 4, name: 'javascript'},
        {id: 3, name: 'golang'},
        {id: 2, name: 'python'},
        {id: 5, name: 'java'},
      ],
    },
    
    click: function () {
    	let language = {id: 5, name: 'kotlin'}
    	let languages = this.data.languages
    	languages.push(language)
    
    	this.setData({
    		languages: languages
    	})
    }
    

    微信小程序开发工具只会报一个警告,并不会导致程序崩溃

    VM6265:2 Do not set same key {5} in wx:key

    比较奇怪的是,这个警告只有在重新渲染时才会报,如果初始化时就使用同样的 key,并不会导致警告

    让每一滴智慧绘制成一条不归路!
  • 相关阅读:
    Java WEB 之页面间传递特殊字符
    c++ using Handle Class Pattern to accomplish implementation hiding
    c++ simple class template example: Stack
    c++ why can't class template hide its implementation in cpp file?
    c++ what happens when a constructor throws an exception and leaves the object in an inconsistent state?
    c++ 用namespace实现java的package的功能
    c++ virtual 和 pure virtual的区别
    c++ istream(ostream)是如何转换为bool的
    c++ 使用boost regex库 总结
    c++ 如何使用第三方的library
  • 原文地址:https://www.cnblogs.com/JdsyJ/p/8603891.html
Copyright © 2011-2022 走看看