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的用法說明