亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解如何理解vue的key屬性

發布時間:2020-09-09 06:30:12 來源:腳本之家 閱讀:202 作者:嘻嘻xixi 欄目:web開發

如果沒有這個屬性的時候vue應用 in-place patch(就地復用)策略。列表里的順序發生改變的時候比如shuffle(列表打亂)的時候,vue為了提升性能,不會移動dom元素,只是更新相應元素的內容節點。

就地復用的弊端

這個默認的模式是高效的,但是只適用于不依賴子組件狀態或臨時 DOM 狀態 (例如:表單輸入值) 的列表渲染輸出。

如上引用自官網,這個模式就是上面的“就地復用”策略。那么是不是依賴子組件狀態的列表渲染采用上面的模式就出問題了呢。如下測試代碼:

 <ul>
  <li v-for="item in items">
   <p>{{ item.title }}</p>
   <p>{{ item.des }}</p>
   <tweet-component></tweet-component>
  </li>
  </ul>
 <script>
  Vue.component("tweet-component", {
  template: `
   <div class="tweet">
   <div class="box">
    {{xixi}}
   </div>
   </div>
  `,
  data() {
   return {
   xixi: Math.random()
   };
  }
  });
  new Vue({
  el: "#app",
  data: {
   items: [
   { title: "nihao1", des: "xiexie1" },
   { title: "nihao2", des: "xiexie2" },
   { title: "nihao3", des: "xiexie3" }
   ]
  },
  methods: {
   shuffle() {
    // lodash的shuffle方法
   this.items = _.shuffle(this.items);
   }
  }
  });
 </script>

操作如下:

詳解如何理解vue的key屬性 

問題出現了:發生變化時,子組件 沒有更新

ps: 測試臨時 DOM 狀態 (例如:表單輸入值)可以參考這個鏈接 List Rendering and Vue's v-for Directive

key的作用

這個時候引入 key 就可以解決這個問題。 key 的作用是給予一個節點唯一的身份識別,有相同父元素的子元素必須有獨特的 key 。這樣它可以前后對比,算出哪些節點是要重復使用或者調整順序。比如原先的 key 的順序是 i1,i2,i3 ,之后變成了 i2,i1,i3 這個時候只要i3保持不變,把i2 insertBefore 到i1節點前就行了(以上是舉例,vue具體怎么操作的需要去研究源碼)。如果是利用數組的 index 來作為 key 則兩次對比沒有區別,就會出現上面動圖里出現的子組件沒有更新的情況。

可以通過查看下面兩個動圖查看dom節點的變化。第一個gif是沒有使用 key ,第二個是使用了 key 。可以看到我點了按鈕后,第一個只是更新 <p> 標簽的內容節點。第二個是移動了某一項的 <li> 標簽。

詳解如何理解vue的key屬性 詳解如何理解vue的key屬性

ps: 另外可以通過chrome的dom斷點功能查看子元素的插入刪除。

DOM 更改斷點

key的其他用途

key不是只能用在v-for上還可以用在其他元素上。如下代碼

<div v-if="toggle">Hello</div>
<div v-else>Goodbye</div>

切換toggle時,它也是切換div。如果你想用上enter/leave animations時,即節點插入和刪除的時候的動畫時就要打破這個復用,如下:

<transition>
 <div v-if="toggle" key="1">Hello</div>
 <div v-else key="2">Goodbye</div>
</transition>

總結

如果你的列表不發生變化,或者你只是往列表最后一項添加元素則看似不必要增加 key 字段。但是你的項目中有很多列表的時候,你有的需要加 key ,有的不需要加。還不如所有的都加上呢避免別人理解困難(^._.^)ノ。

參考鏈接

https://vuejs.org/v2/guide/list.html#key

vuejs.org/v2/api/#key

https://forum.vuejs.org/t/simple-clarification-of-when-using-key-with-v-for-is-appropriate-and-why/28966/5

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

年辖:市辖区| 镇安县| 威海市| 离岛区| 平凉市| 木里| 舟曲县| 丁青县| 凯里市| 鄄城县| 平度市| 蛟河市| 临高县| 弥勒县| 滨海县| 华容县| 蓬安县| 锡林浩特市| 临泽县| 静安区| 巩义市| 会泽县| 屏东县| 贡山| 呼玛县| 宝应县| 海安县| 泰顺县| 荆州市| 广丰县| 上犹县| 互助| 武宣县| 江都市| 汽车| 夏邑县| 平乡县| 额敏县| 安远县| 和田县| 青田县|