首頁  >  文章  >  微信小程式  >  列表渲染wx:key的作用以及條件渲染 wx:if 與 hidden之間的區別

列表渲染wx:key的作用以及條件渲染 wx:if 與 hidden之間的區別

不言
不言轉載
2019-02-16 14:08:013916瀏覽

這篇文章帶給大家的內容是關於微信小程式中使用async/await語法的方法(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

開發微信小程式離不開“頁面渲染”,對於初學者來說很難理解小程式裡的“頁面渲染”是什麼、怎麼用?
而學過 vue 的同學來說,這就比較熟悉了,其實就是資料綁定頁面渲染。
那麼關於頁面渲染最重要的是清單渲染和條件渲染這兩塊,先來看看幾個簡單的例子。

下面是一個「清單渲染」的例子:

<view>
  {{index}}: {{item.message}}
</view>
Page({
  data: {
    array: [{
      message: 'foo',
    }, {
      message: 'bar'
    }]
  }
})

上面的例子可以看出,預設陣列的目前項目的下標變數名稱預設為index,陣列當前項的變數名稱預設為item。當然,使用wx:for-item 可以指定數組目前元素的變數名,使用wx:for-index 可以指定數組目前下標的變數名,如下:

<view>
  {{idx}}: {{itemName.message}}
</view>

下面是個「條件渲染」的範例:

<view>True</view>
Page({
  data: {
    condition: true
  }
})

上面的範例說明,當condition 為真時,頁面會渲染上面的view 標籤。當然也可以用wx:elif 和wx:else 來新增一個else 區塊,如下:

<view> 5}}">1</view>
<view> 2}}">2</view>
<view>3</view>

下面接取正題,探索文章題目的疑問

一、列表渲染中的wx:key 有什麼作用

其實初次看官方文件可能會對wx:key 有點懵,官方解釋是這樣的:

列表渲染wx:key的作用以及條件渲染 wx:if 與 hidden之間的區別

#根據我多年看文件經驗,一般我看不懂的可以忽略不重要的文字,只需專注於重點,例如上圖的文字加粗部分,因此,一開始我選擇不寫wx :key 這個屬性。然而在開發過程中寫多了列表渲染(而沒有加wx:key)之後,控制台會報很多的wx:key 的警告,對於有點代碼潔癖的我看起來很不爽,但又苦於不清楚wx: key 的真正作用,於是自創了一個解決辦法,那就是在每個列表渲染後面加上wx:key="{{index}}",類似下面這樣:

<view>
  {{item}}
</view>

於是我驚奇地發現警告統統不見了,也沒有其他負面影響,於是我就這樣用了大半年。
然而,半年前我做的一個項目裡面有個列表渲染需要試試獲取用戶頭像和暱稱,於是我之前的做法不管用了,每次獲取到的用戶資訊跟當前內容不對應,並且會發生錯亂。於是我重新理解了一遍wx:key,結合下面的例子,我似乎明白了:

<switch>
  {{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 是用來綁定當前列表中的項目特徵的,也就是說,如果清單是動態更新的,那麼wx:key 的作用是保持原有項目的整個狀態不變。
結合上面的例子,我們可以知道,對於列表數組是個物件數組,那麼wx:key 屬性直接寫對應的唯一的屬性名就可以了,比如上面的wx:key="unique", 或者wx: key="id" 也是可以的,只要保持屬性是唯一值就行了,有點類似頁面標籤裡面的id 屬性在頁面是唯一的。
對於清單陣列是個基本型別數組,那麼直接寫wx:key="*this" 就可以了,如下:

<block>
  <view>{{index}}:</view>
  <view>{{item}}</view>
</block>

巧用wx:key 屬性

  • #如果很明確自己的列表渲染是個靜態列表,那麼你可以像我一開始那樣做,加個wx:key="{{index}}" 就可以了

  • 反之,如果是個動態列表,那就得在數組裡找到唯一的鍵值,放在wx:key 裡面

  • 當然如果你無視警告,也不影響功能,不加也行

二、 wx:if 和hidden 有什麼區別

其實我們用條件渲染更多地在用wx:if 而不是hidden,因為前者可以拓展,後者缺乏一定的邏輯。然而他們到底有什麼差別呢?
官方文件 是這樣描述的:

列表渲染wx:key的作用以及條件渲染 wx:if 與 hidden之間的區別

上圖中,我們大概可以了解到,如果需要頻繁切換狀態,用 hidden,否則用 wx:if。
也就是說,wx:if 能夠即時創建渲染元件或銷毀元件,而且當他為真時才會創建,初始為假時什麼也不做,由真變為假時則進行銷毀。所以頻繁切換他是一個比較耗性能舉動。而 hidden 則代表頁面初始渲染時就會把該元件渲染在頁面上,值的真假只是控制其顯示隱藏罷了。頁面不銷毀,則該元件也不會被銷毀。
明白了這一點,你會發現,從我們開發者的角度來說,靈活使用這兩個條件判斷會事半功倍。
以下列舉幾種使用場景給開發者參考:

<view>加载中……</view>
<view>没有更多了</view>

上面代码是一个上拉加载动画显示与隐藏组件,可以看到用的是 hidden,因为他是一个需要频繁切换的组件。

<block>
  <view>
    <text>{{node.children[0].text}}</text>
  </view>
</block>
<block>
  <image></image>
</block>
<block>
  <video></video>
</block>

上面代码展示的是渲染文字还是图片或者是视频,只展示其中的一个那么用 wx:if 最佳。

下面是一个自定义 input 组件:

<view>
  <view>
    <input>
    <view>发送</view>
  </view>
</view>

其功能是点击评论按钮能实时显示输入框,否则隐藏。这里为什么用 wx:if 呢?因为我希望它显示时是新的 input 组件,不是之前渲染好的,这样如果我刚输入完文字,再次评论不会出现上一次的文字残留。

巧用 wx:if 和 hidden

  • 有时我们需要提前渲染好里面的子组件,那么要用 hidden,否则待显示时需要加上渲染的时间

  • 通常情况下,我在隐藏的时候都不需要该组件的话,那就用 wx:if

  • 如果需要在页面中点击切换的渲染,那么考虑小程序性能问题,还是用 hidden 为好

三、思考(引伸)

1、 这个元素在列表和条件渲染上是很好用的,不过要注意不要在这个标签上绑定其他属性,比如 data- 或者绑定事件 bindtap。下面是一个反例:

<block>
  <view>view1</view>
  <view>view2</view>
</block>

上面的代码里,在 js 中定义绑定事件后,你会发现不会执行。原因就在 元素在渲染页面后并不会存在,他不是个组件,不会渲染在页面树节点里面,所以在他上面绑定的事件或者属性也不会有效。

2、 当 wx:for 的值为字符串时,会将字符串解析成字符串数组;另外,花括号和引号之间如果有空格,将最终被解析成为字符串,请看下面的例子:

<view>
  {{item}}
</view>

等同于

<view>
  {{item}}
</view>
<view>
  {{item}}
</view>

等同于

<view>
  {{item}}
</view>

本文参考:微信小程序开发基础教程 https://www.html.cn/study/20.html

以上是列表渲染wx:key的作用以及條件渲染 wx:if 與 hidden之間的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除