Apakah Key in vue? Artikel berikut akan memperkenalkan kepada anda prinsip kunci dalam vue, dan bercakap tentang perbezaan antara kunci tetapan dan bukan kunci tetapan saya harap ia akan membantu semua orang.
Sebelum kita mula, mari kita memulihkan dua adegan kerja sebenar
Apabila kita menggunakan v-for
, kita perlu menambah masa yang dijana oleh key
<ul> <li v-for="item in items" :key="item.id">...</li> </ul>
pada unit Poke sebagai new Date()
dan secara manual memaksa pencetus pemaparan semula key
<Comp :key="+new Date()" />
? key
kunci ialah ID unik yang diberikan kepada setiap vnod, dan ia juga merupakan strategi pengoptimuman perbezaan dengan lebih tepat dan lebih pantas nod vnod. (Belajar perkongsian video: tutorial video vue)
, kita perlu Tambahkan v-for
key
dan secara manual dipaksa untuk mencetuskan pemaparan semula new Date()
key
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>
akan melaksanakan operasi ini: key
vue
Analisis keseluruhan proses:
Bandingkan A, A, nod jenis yang sama, lakukanpatch
dom
Bandingkan B, B, Nod jenis yang sama, lakukan patch
dom
Bandingkan C, F, nod jenis yang sama, melakukan patch
dom
Bandingkan D, C, nod jenis yang sama, teruskan patch
dom
Bandingkan E, D, nod jenis yang sama, teruskan patch
dom
dan gelung berakhir, masukkan E ke dalam DOM
Dalam kes menggunakan
: akan melakukan operasi sedemikian: key
vue
patch
dom
Bandingkan B, B, nod daripada jenis yang sama, teruskanpatch
dom
Bandingkan C, F, nod berlainan jenispatch
dom
patch
dom
Bandingkan C dan C, nod jenis yang sama, lakukan patch
dom
Gelung berakhir, sebelum F dimasukkan ke dalam CMelalui dua di atas contoh kecil, anda boleh melihat tetapan
Ia boleh mengurangkan operasi pada halaman dan meningkatkan kecekapan key
DOM
diff
Apabila Vue.js menggunakan v-for untuk mengemas kini senarai elemen yang diberikan, ia lalai kepada "dalam. -tempat guna semula" Strategi. Jika susunan item data diubah, Vue tidak akan mengalihkan elemen DOM untuk memadankan susunan item data, tetapi hanya akan menggunakan semula setiap elemen di sini dan memastikan ia memaparkan setiap elemen yang telah dipaparkan pada indeks tertentu
Mod lalai ini cekap, tetapi ia hanya sesuai untuk output pemaparan senarai yang tidak bergantung pada keadaan subkomponen atau keadaan DOM sementara (contohnya: nilai input borang)
Adalah disyorkan untuk menggunakannya bila-bila boleh
Disediakan melainkan merentasi kandungan DOM output adalah sangat mudah, atau anda sengaja bergantung pada tingkah laku lalai untuk mendapatkan peningkatan prestasi v-for
源码位置:core/vdom/patch.js
里判断是否为同一个key
,首先判断的是key
值是否相等如果没有设置key
,那么key
为undefined
,这时候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] } } ... }
Atas ialah kandungan terperinci Apakah Key in vue? Apakah perbezaan antara menetapkan kunci dan tidak menetapkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!