久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      vue的key是什么

      在vue中,key是DOM對(duì)象的標(biāo)識(shí),是給每一個(gè)vnode的唯一id,也是diff的一種優(yōu)化策略;可以根據(jù)key,更準(zhǔn)確、 更快的找到對(duì)應(yīng)的vnode節(jié)點(diǎn)。如果數(shù)據(jù)只做展示使用,可以使用index作為key;如果使用index作為key,而后續(xù)操作會(huì)破壞順序,一定會(huì)帶來(lái)效率問(wèn)題,嚴(yán)重時(shí)會(huì)渲染出錯(cuò)誤的DOM。

      vue的key是什么

      前端(vue)入門到精通課程,老師在線輔導(dǎo):聯(lián)系老師
      Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調(diào)試工具:點(diǎn)擊使用

      本教程操作環(huán)境:windows7系統(tǒng)、vue3版,DELL G3電腦。

      1. key是什么

      • key在Vue是DOM對(duì)象的標(biāo)識(shí);key是給每一個(gè)vnode的唯一id,也是diff的一種優(yōu)化策略,可以根據(jù)key,更準(zhǔn)確, 更快的找到對(duì)應(yīng)的vnode節(jié)點(diǎn)。
      • 進(jìn)行列表展示時(shí),默認(rèn)key是index。
      • 如果數(shù)據(jù)只做展示使用,使用index作為key是沒(méi)有任何問(wèn)題的。
      • 如果使用index作為key,而后續(xù)操作會(huì)破壞順序,一定會(huì)帶來(lái)效率問(wèn)題,嚴(yán)重時(shí)會(huì)渲染出錯(cuò)誤的DOM。

      關(guān)于key的作用及實(shí)現(xiàn)原理,下面一一道來(lái)。

      2. key的作用

      key就是一個(gè)標(biāo)識(shí),被使用在Vue中。再詳細(xì)一點(diǎn),key被使用在Vue中的虛擬DOM中,并不會(huì)出現(xiàn)在真實(shí)DOM中。

      2.1 舉一個(gè)例子

      以列表的形式展示一組人員信息。

      <!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <title>key的原理</title>      <!--引入vue-->     <script type="text/javascript" src="../js/vue.js"></script>      </head> <div id="root">     <h2>人員列表</h2>     <ul>         <li v-for="(p,index) in persons">             {{p.name}}-{{p.age}}         </li>     </ul> </div> <body>     <script type="text/javascript">         const vm = new Vue({             el:'#root',             data:{                 persons:[                     {'id':'001', 'name':'張三','age':'18'},                     {'id':'002', 'name':'李四','age':'19'},                     {'id':'003', 'name':'王五','age':'20'}                 ]             }         })     </script> </body> </html>
      登錄后復(fù)制

      這個(gè)html文件在瀏覽器中打開如下圖所示。

      vue的key是什么

      而上述示例html文件中并沒(méi)有使用到key,似乎也沒(méi)有問(wèn)題。當(dāng)然,單純地展示數(shù)據(jù),不寫key是不會(huì)存在問(wèn)題的?!緦W(xué)習(xí)視頻分享:vue視頻教程、web前端視頻】

      現(xiàn)在我們?yōu)樯鲜鍪纠由蟢ey,這里以每條數(shù)據(jù)的id為key

      <li v-for="(p,index) in persons" :key="p.id">     {{p.name}}-{{p.age}} </li>
      登錄后復(fù)制

      加上key的展示結(jié)果和上圖結(jié)果一模一樣。

      vue的key是什么

      而如果我們?cè)跒g覽器上查看元素,不會(huì)看到key的存在。

      vue的key是什么

      截至目前,我們可以得到兩個(gè)結(jié)論:1. 只做數(shù)據(jù)展示用,不寫key是沒(méi)有任何影響的;2.key不會(huì)出現(xiàn)在真實(shí)DOM中

      實(shí)際上,即使不寫key,Vue在生成真實(shí)DOM時(shí),也用到了key,默認(rèn)是數(shù)據(jù)索引(index)

      我們把key替換為index,展示的數(shù)據(jù)不會(huì)產(chǎn)生任何改變。

      <li v-for="(p,index) in persons" :key="index"> 	{{p.name}}-{{p.age}} </li>
      登錄后復(fù)制

      2.2 修改一下上述示例

      在展示人員信息的基礎(chǔ)上顯示索引,并且添加一個(gè)按鈕,功能是在頭部添加人員信息

      對(duì)上述html文件稍加修改。

      <!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <title>key的原理</title>      <!--引入vue-->     <script type="text/javascript" src="../js/vue.js"></script>     <link rel="icon" href="../favicon.ico" type="image/x-icon" />  </head> <div id="root">     <h2>人員列表</h2>     <button @click="add">添加一個(gè)老劉</button>     <ul>         <li v-for="(p,index) in persons" :key="index">             {{p.name}}-{{p.age}}-{{index}}         </li>     </ul> </div> <body>     <script type="text/javascript">         const vm = new Vue({             el:'#root',             data:{                 persons:[                     {'id':'001', 'name':'張三','age':'18'},                     {'id':'002', 'name':'李四','age':'19'},                     {'id':'003', 'name':'王五','age':'20'}                 ]             },             methods:{                 add(){                     const p = {'id':'004', 'name':'老劉','age':'40'}                     this.persons.unshift(p)                 }             }         })     </script> </body> </html>
      登錄后復(fù)制

      我們可以看到,張三、李四、王五的索引分為別0,1,2

      vue的key是什么

      點(diǎn)擊按鈕,添加一個(gè)新人物,這個(gè)時(shí)候索引發(fā)生了變化,新添加的人物“老劉”變?yōu)榱怂饕?,似乎對(duì),也似乎不對(duì)

      vue的key是什么

      當(dāng)然,單純地討論索引,這里一點(diǎn)問(wèn)題也沒(méi)有,下面舉一個(gè)新例子,來(lái)說(shuō)說(shuō)“不對(duì)“在哪里

      2.3 再修改一下示例

      不展示索引了,改為輸入框,在每個(gè)人物后面的輸入框內(nèi)寫上人物的姓,觀察新插入數(shù)據(jù)后原始數(shù)據(jù)的變化

      稍微修改一下html

      <li v-for="(p,index) in persons" :key="index">     {{p.name}}-{{p.age}}     <input type="text"> </li>
      登錄后復(fù)制

      實(shí)際效果就是下圖這樣

      vue的key是什么

      到這里,似乎沒(méi)有什么不對(duì),接下來(lái)就是見證奇跡的時(shí)刻

      添加老劉,出現(xiàn)了問(wèn)題,和我們預(yù)想的不一樣。

      vue的key是什么

      這是key為index的情況,如果修改為數(shù)據(jù)的唯一標(biāo)識(shí),則不會(huì)產(chǎn)生這樣的問(wèn)題。

      <li v-for="(p,index) in persons" :key="p.id">     {{p.name}}-{{p.age}}     <input type="text"> </li>
      登錄后復(fù)制

      誒,這就是我們想要的。

      vue的key是什么
      列表內(nèi)有輸入內(nèi)容,后續(xù)操作破壞了原始順序,如果以index作為key,就會(huì)產(chǎn)生錯(cuò)誤DOM

      3. key的實(shí)現(xiàn)原理

      要解釋key的實(shí)現(xiàn)原理,就要引入Vue一個(gè)十分重要的概念——【虛擬DOM】。

      給出一組數(shù)據(jù),Vue要把這些數(shù)據(jù)渲染到頁(yè)面上,首先要生成【虛擬DOM】,然后根據(jù)【虛擬DOM】去生成【真實(shí)的DOM】。如果數(shù)據(jù)發(fā)生了改變,Vue會(huì)生成【新的虛擬DOM】,注意,這個(gè)【新的虛擬DOM】并不會(huì)直接生成【新的真實(shí)DOM】,否則虛擬DOM一點(diǎn)用處也沒(méi)有了。Vue的操作是,拿根據(jù)新的數(shù)據(jù)生成的【新的虛擬DOM】與之前的【真實(shí)的DOM】去做比較,如果相同,直接延用即可(“拿來(lái)主義”);如果不同,則生成新的DOM對(duì)象。

      在這個(gè)過(guò)程中key扮演了很重要的角色

      根據(jù)最后一個(gè)示例進(jìn)行剖析。

      3.1 key為index的情況

      根據(jù)數(shù)據(jù)生成【真實(shí)DOM】的流程如下:(注意,下圖的真實(shí)DOM中輸入框里的內(nèi)容為生成頁(yè)面后手動(dòng)添加)

      vue的key是什么

      然后,添加人物“老劉”,獲取到一組新數(shù)據(jù)

      vue的key是什么

      Vue拿新數(shù)據(jù)生成【新的虛擬DOM】

      vue的key是什么

      在生成真實(shí)DOM,就需要用新生成的虛擬DOM和原來(lái)的真實(shí)DOM作比較(一條一條分析)

      vue的key是什么

      對(duì)比第一條,key為0,找到舊DOM中key為0的數(shù)據(jù),發(fā)現(xiàn)“老劉-40”和“張三-18”不同,渲染新的數(shù)據(jù)“老劉-40”到頁(yè)面上;再往后,發(fā)現(xiàn)同為輸入框,不必重新渲染,直接使用原來(lái)真實(shí)DOM的內(nèi)容。第一條內(nèi)容就出現(xiàn)了,而這個(gè)輸入框還攜帶有張三的姓。

      vue的key是什么

      對(duì)比第二條,key為1,找到舊DOM中key為1的數(shù)據(jù),發(fā)現(xiàn)“張三-18”和“李四-19”不同,渲染新的數(shù)據(jù)“張三-18”到頁(yè)面上;再往后,發(fā)現(xiàn)同為輸入框,不必重新渲染,直接使用原來(lái)真實(shí)DOM的內(nèi)容。第二條內(nèi)容就出現(xiàn)了,而這個(gè)輸入框還攜帶有李四的姓。

      vue的key是什么

      之后同理。

      回顧這個(gè)過(guò)程,key是作為虛擬DOM中對(duì)象的唯一標(biāo)識(shí),標(biāo)識(shí)出了數(shù)據(jù)的“身份信息”,Vue在虛擬DOM中會(huì)根據(jù)這個(gè)“身份標(biāo)識(shí)”去對(duì)比內(nèi)容,設(shè)計(jì)的初衷是為了節(jié)省資源開支,不必渲染重復(fù)的部分。在本示例中,不但帶來(lái)了效率問(wèn)題,還渲染出了錯(cuò)誤的DOM,后果非常嚴(yán)重。

      3.2 key為id的情況

      直接進(jìn)入添加“老劉”后的新舊DOM對(duì)比。

      vue的key是什么

      對(duì)比第一條,key為‘004’,發(fā)現(xiàn)在舊DOM中并不存在,直接生成“老劉-40”和新的輸入框。

      對(duì)比第二條,key為‘001’,發(fā)現(xiàn)舊DOM中key為‘001’的數(shù)據(jù)相同,直接將“張三-18”和輸入框拿過(guò)來(lái)使用。

      ……

      最后生成正確的DOM,節(jié)省了資源開支。

      3.3 總結(jié)

      推薦使用數(shù)據(jù)的唯一標(biāo)識(shí)作為key,比如id,身份證號(hào),手機(jī)號(hào)等等,通常這些數(shù)據(jù)由后端提供。

      后續(xù)操作不破壞原來(lái)數(shù)據(jù)順序的話,使用index作為key也沒(méi)有任何問(wèn)題。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)