成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

vue中什么是Key?設置key與不設置有什么區別?

vue中什么是Key?下面本篇文章給大家介紹一下vue中key的原理,聊聊設置key與不設置key的區別,希望對大家有所幫助!

vue中什么是Key?設置key與不設置有什么區別?

一、Key是什么

開始之前,我們先還原兩個實際工作場景

  • 當我們在使用v-for時,需要給單元加上key

<ul>     <li v-for="item in items" :key="item.id">...</li> </ul>
  • +new Date()生成的時間戳作為key,手動強制觸發重新渲染

<Comp :key="+new Date()" />

那么這背后的邏輯是什么,key的作用又是什么?

一句話來講

key是給每一個vnode的唯一id,也是diff的一種優化策略,可以根據key,更準確, 更快的找到對應的vnode節點。(學習視頻分享:vue視頻教程)

場景背后的邏輯

當我們在使用v-for時,需要給單元加上key

  • 如果不用key,Vue會采用就地復地原則:最小化element的移動,并且會嘗試盡最大程度在同適當的地方對相同類型的element,做patch或者reuse。
  • 如果使用了key,Vue會根據keys的順序記錄element,曾經擁有了key的element如果不再出現的話,會被直接remove或者destoryed

+new Date()生成的時間戳作為key,手動強制觸發重新渲染

  • 當擁有新值的rerender作為key時,擁有了新key的Comp出現了,那么舊key Comp會被移除,新key Comp觸發渲染

二、設置key與不設置key區別

舉個例子:
創建一個實例,2秒后往items數組插入數據

<body>   <div id="demo">     <p v-for="item in items" :key="item">{{item}}</p>   </div>   <script src="../../dist/vue.js"></script>   <script>     // 創建實例     const app = new Vue({       el: '#demo',       data: { items: ['a', 'b', 'c', 'd', 'e'] },       mounted () {         setTimeout(() => {            this.items.splice(2, 0, 'f')  //         }, 2000);      },    });   </script> </body>

在不使用key的情況,vue會進行這樣的操作:

vue中什么是Key?設置key與不設置有什么區別?

分析下整體流程:

  • 比較A,A,相同類型的節點,進行patch,但數據相同,不發生dom操作
  • 比較B,B,相同類型的節點,進行patch,但數據相同,不發生dom操作
  • 比較C,F,相同類型的節點,進行patch,數據不同,發生dom操作
  • 比較D,C,相同類型的節點,進行patch,數據不同,發生dom操作
  • 比較E,D,相同類型的節點,進行patch,數據不同,發生dom操作
  • 循環結束,將E插入到DOM

一共發生了3次更新,1次插入操作

在使用key的情況:vue會進行這樣的操作:

  • 比較A,A,相同類型的節點,進行patch,但數據相同,不發生dom操作
  • 比較B,B,相同類型的節點,進行patch,但數據相同,不發生dom操作
  • 比較C,F,不相同類型的節點
    • 比較E、E,相同類型的節點,進行patch,但數據相同,不發生dom操作
  • 比較D、D,相同類型的節點,進行patch,但數據相同,不發生dom操作
  • 比較C、C,相同類型的節點,進行patch,但數據相同,不發生dom操作
  • 循環結束,將F插入到C之前

一共發生了0次更新,1次插入操作

通過上面兩個小例子,可見設置key能夠大大減少對頁面的DOM操作,提高了diff效率

設置key值一定能提高diff效率嗎?

其實不然,文檔中也明確表示

當 Vue.js 用 v-for 正在更新已渲染過的元素列表時,它默認用“就地復用”策略。如果數據項的順序被改變,Vue 將不會移動 DOM 元素來匹配數據項的順序, 而是簡單復用此處每個元素,并且確保它在特定索引下顯示已被渲染過的每個元素

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

建議盡可能在使用 v-for 時提供 key,除非遍歷輸出的 DOM 內容非常簡單,或者是刻意依賴默認行為以獲取性能上的提升

三、原理分析

源碼位置:core/vdom/patch.js

里判斷是否為同一個key,首先判斷的是key值是否相等如果沒有設置key,那么keyundefined,這時候undefined是恒等于undefined

function sameVnode (a, b) {     return (         a.key === b.key && (             (                 a.tag === b.tag &&                 a.isComment === b.isComment &&                 isDef(a.data) === isDef(b.data) &&                 sameInputType(a, b)             ) || (                 isTrue(a.isAsyncPlaceholder) &&                 a.asyncFactory === b.asyncFactory &&                 isUndef(b.asyncFactory.error)             )         )     ) }

updateChildren方法中會對新舊vnode進行diff,然后將比對出的結果用來更新真實的DOM

function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {     ...     while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {         if (isUndef(oldStartVnode)) {             ...         } else if (isUndef(oldEndVnode)) {             ...         } else if (sameVnode(oldStartVnode, newStartVnode)) {             ...         } else if (sameVnode(oldEndVnode, newEndVnode)) {             ...         } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right             ...         } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left             ...         } else {             if (isUndef(oldKeyToIdx)) oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx)             idxInOld = isDef(newStartVnode.key)                 ? oldKeyToIdx[newStartVnode.key]                 : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx)             if (isUndef(idxInOld)) { // New element                 createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx)             } else {                 vnodeToMove = oldCh[idxInOld]                 if (sameVnode(vnodeToMove, newStartVnode)) {                     patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue, newCh, newStartIdx)                     oldCh[idxInOld] = undefined                     canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm)                 } else {                     // same key but different element. treat as new element                     createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx)                 }             }             newStartVnode = newCh[++newStartIdx]         }     }     ... }

(學習視頻分享:web前端開發、編程基礎視頻)

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
免费人妻AⅤ无码专区久久综合| 蜜乳一区在线视频| 浪货趴办公桌~H揉| 美女把腿扒开让我添视频| 欧美成人性生免费看的| 日本午夜精品理论片A级APP发| 四虎WWW永久在线精品| 亚洲AV无码成电影在线播放| 亚洲人成国产精品无码果冻| 综合精品欧美日韩国产在线| 波多野美乳人妻HD电影欧美| 国产精品久久久久精品三级| 精品久久久久久久无码| 男男黄Gay片免费网站www| 日产无人区二线三线乱码| 无码专区狠狠躁天天躁| 亚洲中文字幕无码永久在线不卡 | 久久久久久精品免费免费英国| 女局长白白嫩嫩大屁股| 熟妇阿 HD中文电影| 亚洲国产成人精品无码区在线播放 | 国产三级国产经典国产AV| 久久青青草原亚洲AV无码| 人妻无码中文字幕永久有效视频 | 交换朋友夫妻互换客厅韩国5| 美女内射无套日韩免费播放 | 欧美疯狂做受XXXX高潮小说| 天堂中文最新版在线官网在线| 亚洲乱码AV中文一区二区| 999国产精品999久久久久久| 国产精华液和欧美的精华液的区别| 久爱WWW成人网免费视频| 欧美丰满熟妇性XXXX| 无人区一码二码三码四码区别在哪 | 日韩欧美亚洲每日更新在线| 亚洲丰满熟妇浓毛大隂户| 99久久久精品免费观看国产| 国产乱XXXX搡XXXXX搡| 蜜芽久久人人超碰爱香蕉| 天天摸天天碰成人免费视频| 一本精品99久久精品77| 丰满人妻被公侵犯完整版| 久久久久久久精品妇女99| 日本熟妇在线一区二区三区 | 性欧美大战久久久久久久久| 1000部精品久久久久久久久| 国产精品天天看天天狠| 蜜桃无码一区二区三区| 无码精品A∨在线观看无广告| 中日AV乱码一区二区三区乱码| 国产成人AV综合久久| 麻豆国产96在线日韩麻豆| 忘忧草在线影院WWW动漫图片| 再深点灬舒服灬太大了下载| 国产精品久久久久精品…| 奶头被几个流浪汉吃肿了| 性中国少妇熟妇XXXX农村| JAPANESE熟女熟妇多毛毛| 幻女FREE性俄罗斯毛片| 日韩人妻精品无码一区二区三区| 亚洲综合欧美在线一区在线播放| 公交车挺进朋友人妻的身体里| 乱老熟女成熟50ⅩXXX小| 小S货又想挨C了叫大声点小| WWW.COM.含羞草| 久久精品无码一区二区无码| 天天天欲色欲色WWW免费| 99精品久久久久精品双飞| 极品少妇自慰喷白浆av| 熟妇人妻午夜寂寞影院| 99精品无人区乱码1区2区3区 | 国产成人无码AⅤ片在线观看你| 男女性杂交内射妇女BBWXZ| 亚洲AV无码专区国产乱码电影 | 肉感饱满中年熟妇日本| 中国老熟女XXXⅩ全部| 国产无套码AⅤ在线观看| 日韩AV无码免费播放| 中文字幕AV无码一区电影DVD| 孩交乱子XXXX高清影视| 色欲久久久天天天综合网| 18一20亚洲GAY无套| 精品人妻潮喷久久久又裸又黄| 天黑黑影院免费观看视频在线播放 | 被老外做的下身都肿了| 免费国精产品WNW2544| 亚洲精品成人久久久| 国产精品久久久久久超碰| 人妻人人做人做人人爱| 综合图区亚洲另类偷窥| 久久精品蜜芽亚洲国产AV| 亚洲AⅤ无码成人网站国产APP| 丰满大爆乳波霸奶| 人妻无码一区二区三区久| 18禁黄网站禁片免费观看APP| 久久久久久久精品无码AV少妇 | 无码精品人妻一区二区三区人妻斩| 宝贝乖女小芳小雪| 欧美黑人aAAAAAAa| 中国BGMBGMBGM老妇和青年交| 精品伊人久久大线蕉色首页| 亚洲 都市 校园 激情 另类| 国产成人啪精品视频免费APP | 国产成人精品免费午夜APP | 亚洲综合大片6999| 精品人妻视频一区二区三区| 亚洲AV无码AV日韩AV网站| 国产精品久久久久9999小说| 色综合色欲色综合色综合色综合R 色综合色欲色综合色综合色综合 色综合色天天久久婷婷基地 | XXXAV久久久久久久久久久| 女学生14毛片视频片二毛| 在线无码一区二区| 久久亚洲熟妇熟女ⅩXXXHD| 亚洲日韩片无码中文字幕| 精品JAVAPARSER乱偷| 亚洲AV永久无码精品一区二区| 国产清纯白嫩大学生正在播放 | 人妻人人爽人人澡人人喊| CSGO大姐姐AWP多少钱| 欧美精品人妻大乳一区二区 | 在办公室伦流澡到高潮H| 久久综合国产乱子伦精品免费| 亚洲综合国产精品第一页| 久久久不卡国产精品一区二区| 亚洲人成无码网站| 久久精品国产久精国产果冻传媒| 亚洲人成无码网站| 久久久亚洲熟妇熟女ⅩXXX直播 | 亚洲JIZZJIZZ中国妇女| 韩漫漫画在线观看页面免费漫画入| 亚洲AV无码一区二区三区大黄瓜 | 国产精品国产三级国产AV麻豆| 铜铜铜铜铜铜铜铜铜好大好深色 | 亚洲最新无码成AV人| 久久人妻内射无码一区三区| 永久免费AV无码不卡在线观看| 裸体丰满白嫩大尺度尤物| 1000部拍拍拍18勿入免费视频下载 | 欧美性猛交XXXX乱大交| 爆乳JUFD汗だく肉感| 色综合久久久久无码专区| 国产精品麻豆欧美日韩WW| 亚洲AV无码乱码| 久久er99热精品一区二区| 在人线AV无码免费高潮喷水| 欧美大香线蕉线伊人久久| 凹凸国产熟女精品视频| 少妇性饥渴无码A区免费| 国产精品无码一区二区三区免费| 亚洲AV蜜臀日韩AV无码污网站| 精品毛卡卡1卡2卡3麻豆| 又爽又黄无遮挡高潮视频网站| 欧美AⅤ精品一区二区三区| 菠萝蜜视频在线观看入口| 图片小说视频一区二区| 好大好硬好深好爽想要20P| 一本色道无码不卡在线观看| 欧美18VIDEOSEX性极品| 丰满少妇人妻XXXXX| 亚洲AV人无码激艳猛片服务器| 久久久99久久久国产自输拍| 99久久精品国产综合| 色噜噜狠狠色综合久色AⅤ网| 国产麻豆放荡AV剧情演绎| 亚洲日韩AV一区二区三区四区| 免费无码作爱视频| 嗯啊WW免费视频网站| 亚洲AV旡码高清在线观看 | 国产午夜无码福利在线看网站| 亚洲熟女WWW一区二区三区| 欧美成人精品一区二区三区色欲 | 无码人妻啪啪一区二区| 久久99久久99精品免观看吃奶| 18性欧美XXXⅩ性满足| 少妇系列之白嫩人妻| 精品无码国产日韩制服丝袜| 999国内精品永久免费观看| 手机免费AV片在线观看| 久久99精品久久久久子伦 | 欧美一区二区在线视频| 国产精品久久久久久久久鸭 | 成年女人午夜毛片免费视频| 性生生活大片又黄又| 美女把腿扒开让我添视频| 疯狂做受XXXX高潮视频免费| 亚洲女人人体ASS| 让人爽到湿的小黄书软件下载| 国产午夜成人免费看片APP| 中日韩人妻中文字幕视频在线| 色婷婷五月色综合AⅤ小说| 狠狠色噜噜狠狠狠888777米| AV色蜜桃一区二区三区| 无码任你躁久久久久久久| 老熟女与小伙偷欢视频| 丰满少妇A级毛片野外| 亚洲午夜理论片在线观看| 日本熟妇人妻XXXXX人电影| 精品无码成人网站久久久久久| 成人免费乱码大片A毛片| 亚洲少妇XXXXX|