線上服務(wù)咨詢
Article/文章
記錄成長點滴 分享您我感悟
列表渲染wx:key的作用以及條件渲染 wx:if 與 hidden之間的區(qū)別
開發(fā)微信小程序離不開“頁面渲染”,對于初學(xué)者來說很難理解小程序里的“頁面渲染”是什么、怎么用?
而學(xué)過 vue 的同學(xué)來說,這個就比較熟悉了,實際上就是數(shù)據(jù)綁定頁面渲染。
那么關(guān)于頁面渲染最重要的是列表渲染和條件渲染這兩塊,先來看看幾個簡單的例子。
下面是個“列表渲染”的例子:
<view wx:for="{{array}}"> {{index}}: {{item.message}}</view>
Page({ data: { array沈陽小程序制作: [{ message: 'foo', }, { message: 'bar' }] }})
上面的例子可以看出,默認(rèn)數(shù)組的當(dāng)前項的下標(biāo)變量名默認(rèn)為 index,數(shù)組當(dāng)前項的變量名默認(rèn)為 item。當(dāng)然,使用 wx:for-item 可以指定數(shù)組當(dāng)前元素的變量名,使用 wx:for-index 可以指定數(shù)組當(dāng)前下標(biāo)的變量名,如下:
<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName"> {{idx}}: {{itemName.message}}</view>
下面是個“條件渲染”的例子:
<view wx:if="{{condition}}">True</view>
Page({ data: { condition: true }})
上面的例子說明,當(dāng) condition 為真時,頁面渲染上面的 view 標(biāo)簽。當(dāng)然也可以用 wx:elif 和 wx:else 來添加一個 else 塊,如下:
<view wx:if="{{length > 5}}">1</view><view wx:elif="{{length > 2}}">2</view><view wx:else>3</view>
下面接入正題,探索文章題目的疑問
一、 列表渲染中的 wx:key 有什么作用
其實初次看 官方文檔 可能會對 wx:key 有點懵,官方解釋是這樣的:
根據(jù)我多年看文檔經(jīng)驗,一般我看不懂的可以忽略不重要的文字,只需關(guān)注重點,例如上圖的文字加粗部分,因此,一開始我選擇不寫 wx:key 這個屬性。然而在開發(fā)過程中寫多了列表渲染(而沒有加 wx:key)之后,控制臺會報很多的 wx:key 的警告,對于有點代碼潔癖的我看起來很不爽,但又苦于不清楚 wx:key 的真正作用,于是自創(chuàng)了一個解決辦法,那就是在每個列表渲染后面加上 wx:key="{{index}}",類似下面這樣:
<view wx:for="{{array}}" wx:key="{{index}}"> {{item}}</view>
于是我驚奇地發(fā)現(xiàn)警告統(tǒng)統(tǒng)不見了,也沒有其他負(fù)面影響,于是我就這樣用了大半年。
然而,半年前我做的一個項目里面有個列表渲染需要試試獲取用戶頭像和昵稱,于是我之前的做法不管用了,每次獲取到的用戶信息跟當(dāng)前內(nèi)容不對應(yīng),并且會發(fā)生錯亂。于是我重新理解了一遍 wx:key,結(jié)合下面的例子,我似乎明白了:
<switch wx:for="{{objectArray}}" wx:key="unique" style="display: block;"> {{item.id}}</switch>
Page({ data: { objectArray: [ {id: 5, unique: 'unique_5'}, {id: 4, unique: 'unique_4'}, {id: 3, unique: 'unique_3'}, {id: 2, unique: 'unique_2'}, {id: 1, unique: 'unique_1'}, {id: 0, unique: 'unique_0'}, ] }})
其實,wx:key 是用來綁定當(dāng)前列表中的項目特征的,也就是說,如果列表是動態(tài)更新的,那么 wx:key 的作用是保持原有項目的整個狀態(tài)不變。
結(jié)合上面的例子,我們可以知道,對于列表數(shù)組是個對象數(shù)組,那么 wx:key 屬性直接寫對應(yīng)的唯一的屬性名就可以了,比如上面的 wx:key="unique", 或者 wx:key="id" 也是可以的,只要保持屬性是唯一值就行了,有點類似頁面標(biāo)簽里面的 id 屬性在頁面是唯一的。
對于列表數(shù)組是個基本類型數(shù)組,那么直接寫 wx:key="*this" 就可以了,如下:
<block wx:for="{{[1, 2, 3]}}" wx:key="*this"> <view>{{index}}:</view> <view>{{item}}</view></block>微信小程序