關於微信小程序WXML列表渲染中的wx:key筆記說明

1.直接看看官方文檔中給出的說明:

如果列表中項目的位置會動態改變或者有新的項目添加到列表中,
並且希望列表中的項目保持自己的特徵和狀態(如 input 中的輸入內容,switch 的選中狀態),
需要使用 wx:key 來指定列表中項目的唯一的標識符。

wx:key 的值以兩種形式提供

1.字符串,代表在 for 循環的 array 中 item 的某個 property,該 property 的值需要是列表中唯一的字符串或數字,且不能動態改變。
2.保留關鍵字 *this 代表在 for 循環中的 item 本身,這種表示需要 item 本身是一個唯一的字符串或者數字,如:

當數據改變觸發渲染層重新渲染的時候,會校正帶有 key 的組件,框架會確保他們被重新排序,
而不是重新創建,以確保使組件保持自身的狀態,並且提高列表渲染時的效率。

如不提供 wx:key,會報一個 warning, 如果明確知道該列表是靜態,或者不必關注其順序,可以選擇忽略。

2.舉個小例子說明上述項目中的狀態改變是什麼意思?

1. 在某一Page的js文件中添加下述代碼:

Page({
  data:{
    lines:[
      {
        "id":1,
        "name":"switch1"
      },
      {
        "id": 2,
        "name": "switch2"
      },
      {
        "id": 3,
        "name": "switch3"
      }
    ]
  },
})

2.在該配置的wxml文件中添加switch:

<view wx:for="{{lines}}">
  <switch>{{item.name}}</switch>
</view>

Ctrl + s 運行效果如下:

3.接下來來對上述switch做動態的改變;

在WXML文件中添加一個更新按鈕,通過點擊該按鈕,可以添加一個switch開關,即對上述lines進行一個數據的更新:

<view wx:for="{{lines}}">
  <switch>{{item.name}}</switch>
</view>

<button bindtap="tapEvent">更新</button>

運行後效果如下:

在js文件中添加相應的事件觸發函數:

Page({

  data:{
    lines:[
      {
        "id":1,
        "name":"switch1"
      },
      {
        "id": 2,
        "name": "switch2"
      },
      {
        "id": 3,
        "name": "switch3"
      }
    ]

  },
  tapEvent:function(event){
    var lines = this.data.lines;
    lines.splice(0,0,{
      id:4,
      name:'switch4'
    });
    this.setData({
      lines:lines
    })
  }
  
})

tapEvent實現的功能爲當點擊該更新按鈕後,在lines中添加一個對象{id:4,name : 'switch4'},並對lines進行更新。

運行後,點擊更新按鈕,發現成功添加一個switch:

那麼什麼是項目中的狀態改變呢?

重新運行項目,然後選中其中的一個switch:

點擊更新後:

發現switch1的選中狀態並沒有被記錄下來,這種情況下就需要用到wx:key來對指定列表中的項目進行唯一標識:

將之前的WXML代碼修改如下:

<view wx:for="{{lines}}" wx:key="id">
  <switch>{{item.name}}</switch>
</view>

<button bindtap="tapEvent">更新</button>

重新運行,並選中其中的switch1:

此時點擊更新按鈕後,發現switch1的狀態已經成功保持:

當然如果lines爲[1,2,3]這種數組,那麼wx:key則必須設爲:

<view wx:for="{{lines}}" wx:key="*this">
  <switch>{{item.name}}</switch>
</view>

<button bindtap="tapEvent">更新</button>

【注意】即使列表中的組件沒有發生狀態變化,也要使用wx:key。爲什麼??因爲效率比較高。讓我們再次看到上述官方文檔:

當數據改變觸發渲染層重新渲染的時候,會校正帶有 key 的組件,框架會確保他們被重新排序,
而不是重新創建,以確保使組件保持自身的狀態,並且提高列表渲染時的效率。

以上即爲wx:key的用法說明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章