电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Vue中key的作用示例代碼詳解

瀏覽:109日期:2023-01-14 11:32:19

Vue中key的作用

key的特殊attribute主要用在Vue的虛擬DOM算法,在新舊Nodes對(duì)比時(shí)辨識(shí)VNodes。如果不使用key,Vue會(huì)使用一種最大限度減少動(dòng)態(tài)元素并且盡可能的嘗試就地修改、復(fù)用相同類型元素的算法,而使用key時(shí),它會(huì)基于key的變化重新排列元素順序,并且會(huì)移除key不存在的元素。此外有相同父元素的子元素必須有獨(dú)特的key,重復(fù)的key會(huì)造成渲染錯(cuò)誤。

描述

首先是官方文檔的描述,當(dāng)Vue正在更新使用v-for渲染的元素列表時(shí),它默認(rèn)使用就地更新的策略,如果數(shù)據(jù)項(xiàng)的順序被改變,Vue將不會(huì)移動(dòng)DOM元素來匹配數(shù)據(jù)項(xiàng)的順序,而是就地更新每個(gè)元素,并且確保它們?cè)诿總€(gè)索引位置正確渲染。這個(gè)默認(rèn)的模式是高效的,但是只適用于不依賴子組件狀態(tài)或臨時(shí)DOM狀態(tài)的列表渲染輸出,例如表單輸入值。為了給Vue一個(gè)提示,以便它能跟蹤每個(gè)節(jié)點(diǎn)的身份,從而重用和重新排序現(xiàn)有元素,你需要為每項(xiàng)提供一個(gè)唯一 key attribute,建議盡可能在使用v-for時(shí)提供key attribute,除非遍歷輸出的DOM內(nèi)容非常簡(jiǎn)單,或者是刻意依賴默認(rèn)行為以獲取性能上的提升。

簡(jiǎn)單來說,當(dāng)在列表循環(huán)中使用key時(shí),需要使用key來給每個(gè)節(jié)點(diǎn)做一個(gè)唯一標(biāo)識(shí),diff算法就可以正確的識(shí)別此節(jié)點(diǎn),找到正確的位置直接操作節(jié)點(diǎn),盡可能地進(jìn)行重用元素,key的作用主要是為了高效的更新虛擬DOM。此外,使用index作為key是并不推薦的做法,其只能保證Vue在數(shù)據(jù)變化時(shí)強(qiáng)制更新組件,以避免原地復(fù)用帶來的副作用,但不能保證最大限度的元素重用,且使用index作為key在數(shù)據(jù)更新方面和不使用key的效果基本相同。

示例

首先定義一個(gè)Vue實(shí)例,渲染四個(gè)列表,分別為簡(jiǎn)單列表與復(fù)雜列表,以及其分別攜帶key與不攜帶key時(shí)對(duì)比其更新渲染時(shí)的速度,本次測(cè)試使用的是Chrome 81.0,每次在Console執(zhí)行代碼時(shí)首先會(huì)進(jìn)行刷新重新加載界面,避免瀏覽器以及Vue自身優(yōu)化帶來的影響。

<!DOCTYPE html><html><head> <title>Vue</title></head><body> <div id='app'> <ul> <li v-for='item in simpleListWithoutKey' >{{item}}</li> </ul> <ul> <li v-for='item in simpleListWithKey' :key='item' >{{item}}</li> </ul> <ul> <li v-for='item in complexListWithoutKey'> <span v-for='value in item.list' v-if='value > 5'>{{value}}</span> </li> </ul> <ul> <li v-for='item in complexListWithKey' :key='item.id'> <span v-for='value in item.list' :key='value' v-if='value > 5'>{{value}}</span> </li> </ul> </div></body><script src='https://cdn.staticfile.org/vue/2.2.2/vue.min.js'></script><script type='text/javascript'> var vm = new Vue({ el: ’#app’, data: { simpleListWithoutKey: [1, 2, 3, 4, 5, 6], simpleListWithKey: [1, 2, 3, 4, 5, 6], complexListWithoutKey:[ {id: 1, list: [1, 2, 3]}, {id: 2, list: [4, 5, 6]}, {id: 3, list: [7, 8, 9]} ], complexListWithKey:[ {id: 1, list: [1, 2, 3]}, {id: 2, list: [4, 5, 6]}, {id: 3, list: [7, 8, 9]} ], } })</script></html>

簡(jiǎn)單列表

在簡(jiǎn)單列表的情況下,不使用key可能會(huì)比使用key的情況下在更新時(shí)的渲染速度更快,這也就是官方文檔中提到的,除非遍歷輸出的DOM內(nèi)容非常簡(jiǎn)單,或者是刻意依賴默認(rèn)行為以獲取性能上的提升。在下面的例子中可以看到?jīng)]有key的情況下列表更新時(shí)渲染速度會(huì)快,當(dāng)不存在key的情況下,這個(gè)列表直接進(jìn)行原地復(fù)用,原有的節(jié)點(diǎn)的位置不變,原地復(fù)用元素,將內(nèi)容更新為5、6、7、8、9、10,并添加了11與12兩個(gè)節(jié)點(diǎn),而存在key的情況下,原有的1、2、3、4節(jié)點(diǎn)被刪除,5、6節(jié)點(diǎn)保留,添加了7、8、9、10、11、12六個(gè)節(jié)點(diǎn),由于在DOM的增刪操作上比較耗時(shí),所以表現(xiàn)為不帶key的情況下速度更快一些。

// 沒有key的情況下console.time();vm.simpleListWithoutKey = [5, 6, 7, 8, 9, 10, 11, 12];vm.$nextTick(() => console.timeEnd());// default: 2.193056640625ms

// 存在key的情況下console.time();vm.simpleListWithKey = [5, 6, 7, 8, 9, 10, 11, 12];vm.$nextTick(() => console.timeEnd());// default: 3.2138671875ms

原地復(fù)用可能會(huì)帶來一些副作用,文檔中提到原地復(fù)用這個(gè)默認(rèn)的模式是高效的,但是只適用于不依賴子組件狀態(tài)或臨時(shí)DOM狀態(tài)的列表渲染輸出,例如表單輸入值。在不設(shè)置key的情況下,元素中沒有與數(shù)據(jù)data綁定的部分,Vue會(huì)默認(rèn)使用已經(jīng)渲染的DOM,而綁定了數(shù)據(jù)data的部分會(huì)進(jìn)行跟隨數(shù)據(jù)渲染,假如操作了元素位置,則元素中未綁定data的部分會(huì)停留在原地,而綁定了data的部分會(huì)跟隨操作進(jìn)行移動(dòng),在下面的例子中首先需要將兩個(gè)A之后的輸入框添加數(shù)據(jù)信息,這樣就制作了一個(gè)臨時(shí)狀態(tài),如果此時(shí)點(diǎn)擊下移按鈕,那么不使用key的組中的輸入框?qū)⒉粫?huì)跟隨下移,且B到了頂端并成為了紅色,而使用key的組中會(huì)將輸入框進(jìn)行下移,且A依舊是紅色跟隨下移。

<!DOCTYPE html><html><head> <meta charset='utf-8'> <meta name='viewport' content='width=device-width'> <title>就地復(fù)用</title></head><body> <div id='app'> <h3>采用就地復(fù)用策略(vuejs默認(rèn)情況)</h3> <div v-for=’(p, i) in persons’> <span>{{p.name}}<span> <input type='text'/> <button @click=’down(i)’ v-if=’i != persons.length - 1’>下移</button> </div> <h3>不采用就地復(fù)用策略(設(shè)置key)</h3> <div v-for=’(p, i) in persons’ :key=’p.id’> <span>{{p.name}}<span> <input type='text'/> <button @click=’down(i)’ v-if=’i != persons.length - 1’>下移</button> </div> </div><script src='https://cdn.staticfile.org/vue/2.2.2/vue.min.js'></script> <script> new Vue({ el: ’#app’, data: { persons: [ { id: 1, name: ’A’ }, { id: 2, name: ’B’ }, { id: 3, name: ’C’ } ] }, mounted: function(){ // 此DOM操作將兩個(gè)A的顏色設(shè)置為紅色 主要是為了演示原地復(fù)用 document.querySelectorAll('h3 + div > span:first-child').forEach( v => v.style.color='red'); }, methods: { down: function(i) { if (i == this.persons.length - 1) return; var listClone = this.persons.slice(); var one = listClone[i]; listClone[i] = listClone[i + 1]; listClone[i + 1] = one; this.persons = listClone; } } }); </script></body></html><!-- 源于 https://www.zhihu.com/question/61078310 @霸都丶傲天 有修改-->

復(fù)雜列表

使用key不僅能夠避免上述的原地復(fù)用的副作用,且在一些操作上可能能夠提高渲染的效率,主要體現(xiàn)在重新排序的情況,包括在中間插入和刪除節(jié)點(diǎn)的操作,在下面的例子中沒有key的情況下重新排序會(huì)原地復(fù)用元素,但是由于v-if綁定了data所以會(huì)一并進(jìn)行操作,在這個(gè)DOM操作上比較消耗時(shí)間,而使用key得情況則直接復(fù)用元素,v-if控制的元素在初次渲染就已經(jīng)決定,在本例中沒有對(duì)其進(jìn)行更新,所以不涉及v-if的DOM操作,所以在效率上會(huì)高一些。

console.time();vm.complexListWithoutKey = [ {id: 3, list: [7, 8, 9]}, {id: 2, list: [4, 5, 6]}, {id: 1, list: [1, 2, 3]}, ];vm.$nextTick(() => console.timeEnd());vm.$nextTick(() => console.timeEnd());// default: 4.100244140625ms

console.time();vm.complexListWithKey = [ {id: 3, list: [7, 8, 9]}, {id: 2, list: [4, 5, 6]}, {id: 1, list: [1, 2, 3]}, ];vm.$nextTick(() => console.timeEnd());// default: 3.016064453125ms

每日一題

https://github.com/WindrunnerMax/EveryDay

參考

https://cn.vuejs.org/v2/api/#keyhttps://www.jb51.net/article/146991.htmhttps://www.zhihu.com/question/61078310https://www.jb51.net/article/167590.htm

https://www.jb51.net/article/135934.htmhttps://www.jb51.net/article/184127.htmhttps://github.com/Advanced-Frontend/Daily-Interview-Question/issues/1https://cn.vuejs.org/v2/guide/list.html#%E7%BB%B4%E6%8A%A4%E7%8A%B6%E6%80%81

總結(jié)

到此這篇關(guān)于Vue中key的作用的文章就介紹到這了,更多相關(guān)vue key 作用內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 氧化锆陶瓷_氧化锆陶瓷加工_氧化锆陶瓷生产厂家-康柏工业陶瓷有限公司 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 汽车水泵_汽车水泵厂家-瑞安市骏迪汽车配件有限公司 | 江苏全风,高压风机,全风环保风机,全风环形高压风机,防爆高压风机厂家-江苏全风环保科技有限公司(官网) | 光纤测温-荧光光纤测温系统-福州华光天锐光电科技有限公司 | 科箭WMS仓库管理软件-TMS物流管理系统-科箭SaaS云服务 | 丁基胶边来料加工,医用活塞边角料加工,异戊二烯橡胶边来料加工-河北盛唐橡胶制品有限公司 | 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 蜜蜂职场文库_职场求职面试实用的范文资料大全 | 安徽华耐泵阀有限公司-官方网站 安德建奇火花机-阿奇夏米尔慢走丝|高维|发那科-北京杰森柏汇 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 合肥升降机-合肥升降货梯-安徽升降平台「厂家直销」-安徽鼎升自动化科技有限公司 | 厂房出售_厂房仓库出租_写字楼招租_土地出售-中苣招商网-中苣招商网 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 石牌坊价格石牌坊雕刻制作_石雕牌坊牌楼石栏杆厂家_山东嘉祥石雕有限公司 | ?水马注水围挡_塑料注水围挡_防撞桶-常州瑞轩水马注水围挡有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | 氧化铁红厂家-淄博宗昂化工| 隐形纱窗|防护纱窗|金刚网防盗纱窗|韦柏纱窗|上海青木装潢制品有限公司|纱窗国标起草单位 | 仿清水混凝土_清水混凝土装修_施工_修饰_保护剂_修补_清水混凝土修复-德州忠岭建筑装饰工程 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 集装箱标准养护室-集装箱移动式养护室-广州璟业试验仪器有限公司 | 美缝剂_美缝剂厂家_美缝剂加盟-地老板高端瓷砖美缝剂 | 在线钠离子分析仪-硅酸根离子浓度测定仪-油液水分测定仪价格-北京时代新维测控设备有限公司 | 自动焊锡机_点胶机_螺丝机-锐驰机器人 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 异噻唑啉酮-均三嗪-三丹油-1227-中北杀菌剂厂家 | 步进驱动器「一体化」步进电机品牌厂家-一体式步进驱动 | 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP | 新能源汽车教学设备厂家报价[汽车教学设备运营18年]-恒信教具 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 网络推广公司_网络营销方案策划_企业网络推广外包平台-上海澜推网络 | 无锡网站建设-做网站-建网站-网页设计制作-阿凡达建站公司 | 橡胶膜片,夹布膜片,橡胶隔膜密封,泵阀设备密封膜片-衡水汉丰橡塑科技公司网站 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | TYPE-C厂家|TYPE-C接口|TYPE-C防水母座|TYPE-C贴片-深圳步步精 | 电缆故障测试仪_电缆故障定位仪_探测仪_检测仪器_陕西意联电气厂家 |