最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue開發(fā)實例探究key的作用詳解

 更新時間:2023年01月10日 09:15:52   作者:MAYOHA  
這篇文章主要為大家介紹了Vue開發(fā)實例探究key的作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

一提到 vue 中的 key,你會想到什么?使用v-for時需要使用 key ?key 不能重復?建議不要使用 index 來做key的值?這究竟是為什么呢?就下來我們就一起來通過實例來一探究竟。

為什么不推薦使用 index 作為 key?

我們先來看兩個例子 為了能夠監(jiān)聽元素的創(chuàng)建與銷毀,我們需要將一個div元素封裝為一個組件,取名為Test

 <template>
   <div>
     {{ Math.floor(Math.random() * 100) }}
   </div>
 </template>
 <script>
 export default {
   props: ["mark"],
   mounted() {
     console.log("create", this.mark)
   },
   beforeDestroy() {
     console.log("destroy", this.mark)
   }
 }
 </script>

使用 index 作為 key

 <template>
   <div>
     <Test v-for="(item,index) in arr" :key="index" :mark="item"></Test>
     <button @click="changeArr">change</button>
   </div>
 </template>
 <script>
 import Test from './Test'
 export default {
   data() {
     return {
       arr: [1,2,3,4,5]
     }
   },
   components: {
     Test
   },
   methods: {
     changeArr() {
       this.arr = [6,7,8,9]
     }
   }
 };
 </script>

通過點擊按鈕改變數(shù)組我們可以發(fā)現(xiàn)因為數(shù)組的改變有一個組件(item 為5的組件)被銷毀,但并沒有新的 Test 組件創(chuàng)建。由此我們可以得出一個結論:如果元素 key 的值未發(fā)生變化,那么該元素就不會進行銷毀與重建。 我們再來看下另外一個例子

 <template>
   <div>
     <Test v-for="item in arr" :key="item" :mark="item"></Test>
     <button @click="changeArr">change</button>
   </div>
 </template>
 <script>
 import Test from './Test'
 export default {
   data() {
     return {
       arr: [1,2,3,4,5]
     }
   },
   components: {
     Test
   },
   methods: {
     changeArr() {
       this.arr = [5,4,3,2,6]
     }
   }
 };
 </script>

上述兩個例子的代碼區(qū)別是:綁定的 key 不同 通過點擊按鈕改變數(shù)組,每個元素的 key 都會發(fā)生變化,所以元素都會被銷毀,然后重新創(chuàng)建,但事實并非如此。

實驗結果是:只有key為1的元素被銷毀,key為6的元素被創(chuàng)建 其實這也是合理的,我最初的key為2,改變之后的key為3,但是key為3這個元素之前就存在,這就意味著我可以直接使用key為3的這個元素,無需銷毀再創(chuàng)建。 所以我們之前的結論還需要進一步的完善:如果元素 key 的值發(fā)生改變但未產(chǎn)生新的key,那么Vue就會復用之前key的那個元素。 所以為什么不推薦 index 作為 key? 雖然上述的兩個例子都會復用 key,但他們最大的區(qū)別在于,使用index作為key會產(chǎn)生一個副作用,若使用數(shù)據(jù)本身則不會產(chǎn)生副作用。 通過第一個例子我們可以發(fā)現(xiàn),即使我們的數(shù)據(jù)發(fā)生了翻天覆地的變化,但因為我們使用index作為key,所以元素不會被銷毀與重建,這就會導致我們在mounted、created等鉤子中做的一些操作無法生效,若這些鉤子中有依賴父組件傳來的值,那造成的影響將是致命的。 我們再看一個使用 index 引起更新錯誤的例子

 <template>
   <div>
     <div v-for="(item, index) in arr" :key="index">
       <Test></Test>
       <button @click="deleteItem(index)">delete</button>
     </div>
   </div>
 </template>
 <script>
 import Test from './Test'
 export default {
   name: 'App',
   data() {
     return {
       arr: [1,2,3,4,5]
     }
   },
   components: {
     Test
   },
   methods: {
     deleteItem(i) {
       this.arr.splice(i, 1)
     }
   }
 }
 </script>

無論我們點擊哪一個數(shù)字后的刪除按鈕,刪除的都是最后一個數(shù)字。 如果使用數(shù)組的值作為 key 則不會出現(xiàn)該錯誤

如果 key 重復會導致什么樣的錯誤?

想必這個錯大家應該都遇見過Duplicate keys detected: 'xx'. This may cause an update error.那么它到底會導致什么樣的更新錯誤呢?
和使用 index 作為 key 所造成的錯誤類似,我們將上述例子的 key 更改為一個固定的值即可復現(xiàn)該錯誤
不過,在 Vue3 中并不會在控制臺中主動拋出 key 重復的錯誤。

使用 key 和不使用 key 有什么差別?

復用上的差別,如果使用 key,只要 key 發(fā)生變化,那么這個元素就必定會被銷毀然后重建,若沒有key,則Vue會盡可能的復用元素,以獲取性能上的提升。(這應該就是Vue文檔中所提到的默認行為) 我們可以使用上面的例子,通過添加和刪除key來驗證這一結論

key的實際應用

  • v-for語句中使用,一是為了令 Vue 能夠正確的復用元素,二是因為編輯器會報錯~~~~
  • 利用 key 一旦更改就會銷毀重新創(chuàng)建的特性,實現(xiàn)強制替換元素來完整的觸發(fā)生命周期鉤子

上述結論在Vue3中也成立嗎?

成立。 已知的不同之處在于 Vue3 不會在控制臺中主動拋出 key 重復的錯誤。

總結

相同父元素下的子元素

使用key

  • 如果元素 key 的值未發(fā)生變化,那么該元素就不會進行銷毀與重建。
  • 如果元素 key 的值發(fā)生改變但未產(chǎn)生新的key,那么Vue就會復用之前key的那個元素。
  • 如果元素 key 的值為一個全新的值,那么該元素就會被銷毀與重建,如果是組件,則會觸發(fā)完整的生命周期鉤子

不使用key

盡可能的復用節(jié)點

以上就是Vue開發(fā)實例探究key的作用詳解的詳細內(nèi)容,更多關于Vue key作用的資料請關注腳本之家其它相關文章!

相關文章

  • Vue.js系列之項目搭建(1)

    Vue.js系列之項目搭建(1)

    今天要講講Vue2.0了。最近將公司App3.0用vue2.0構建了一個web版,因為是第一次使用vue,而且一開始使用的時候2.0出來一個月不到,很多坑都是自己去踩的,現(xiàn)在項目要上線了,所以記錄一些過程
    2017-01-01
  • Vue項目中數(shù)據(jù)的深度監(jiān)聽或對象屬性的監(jiān)聽實例

    Vue項目中數(shù)據(jù)的深度監(jiān)聽或對象屬性的監(jiān)聽實例

    這篇文章主要介紹了Vue項目中數(shù)據(jù)的深度監(jiān)聽或對象屬性的監(jiān)聽實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue2項目中對百度地圖的封裝使用詳解

    Vue2項目中對百度地圖的封裝使用詳解

    近期項目需求相關地圖限定使用百度地圖,功能比較簡單,下面這篇文章主要給大家介紹了關于Vue2項目中對百度地圖的封裝使用的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • vue 2.x 中axios 封裝的get 和post方法

    vue 2.x 中axios 封裝的get 和post方法

    本文通過實例代碼給大家介紹了vue 2.x 中axios 封裝的get 和post方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-02-02
  • vue中數(shù)據(jù)不響應的問題及解決

    vue中數(shù)據(jù)不響應的問題及解決

    這篇文章主要介紹了vue中數(shù)據(jù)不響應的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue3中的:deep()深度選擇器詳解

    vue3中的:deep()深度選擇器詳解

    本文講述了"v-deep"深度選擇器被廢棄的情況,作者提醒讀者更新知識庫,避免誤導他人,深度選擇器是HTML5的新屬性,用于實現(xiàn)組件私有化和防止樣式污染,如果想讓樣式中的一個選擇器作用得更深,可以使用深度選擇器,但現(xiàn)在,以前的寫法已不再支持,需要調整方法
    2024-10-10
  • 如何使用HBuilderX把vue項目打包成apk

    如何使用HBuilderX把vue項目打包成apk

    這篇文章主要介紹了如何使用HBuilderX把vue項目打包成apk,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • vue實現(xiàn)隨機驗證碼功能的實例代碼

    vue實現(xiàn)隨機驗證碼功能的實例代碼

    這篇文章主要介紹了vue實現(xiàn)隨機驗證碼功能的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • 關于electron-vue打包后運行白屏的解決方案

    關于electron-vue打包后運行白屏的解決方案

    這篇文章主要介紹了關于electron-vue打包后運行白屏的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue-resource + json-server模擬數(shù)據(jù)的方法

    vue-resource + json-server模擬數(shù)據(jù)的方法

    本篇文章主要介紹了vue-resource + json-server模擬數(shù)據(jù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11

最新評論

禹州市| 成武县| 凤庆县| 陵川县| 巴塘县| 兴城市| 仙桃市| 绥阳县| 穆棱市| 德安县| 当雄县| 稷山县| 洮南市| 望江县| 苍山县| 贵港市| 商洛市| 德钦县| 内丘县| 大化| 治县。| 蓬安县| 微山县| 肥西县| 霍邱县| 文水县| 河北省| 兴安县| 呼玛县| 洛扎县| 翁源县| 南宫市| 蚌埠市| 紫金县| 紫阳县| 蛟河市| 万宁市| 达孜县| 盖州市| 青冈县| 兖州市|