使用Vue框架搭建项目时,会使用到很多的指令,进行数据渲染时,我们一般会用到v-for,那么我们发现在使用v-for时,经常会写一个key值,那么这个key值得作用是什么?
vue中在进行列表渲染的时候,会默认遵守 就地复用策略
就地复用策略:
当在进行列表渲染的时候,vue会直接对已有的标签进行复用,不会整个的将所有的标签全部重新删除和创建,只会重新渲染数据,然后再创建新的元素直到数据渲染完为止
Vue中为v-for提供了一个属性,key:
key属性可以用来提升v-for渲染的效率!,vue不会去改变原有的元素和数据,而是创建新的元素然后把新的数据渲染进去
在使用v-for的时候,vue里面需要我们给元素添加一个key属性,这个key属性必须是唯一的标识
要了解key,我们还需要了解一下虚拟DOM和Diff算法:
核心是基于两个简单的假设:1. 两个相同的组件产生类似的DOM结构,不同的组件产生不同的DOM结构。2. 同一层级的一组节点,他们可以通过唯一的id进行区分。
当页面的数据发生变化时,Diff算法只会比较同一层级的节点:
如果节点类型不同,直接干掉前面的节点,再创建并插入新的节点,不会再比较这个节点以后的子节点了。
如果节点类型相同,则会重新设置该节点的属性,从而实现节点的更新。
当某一层有很多相同的节点时,也就是列表节点时,Diff算法的更新过程默认情况下也是遵循以上原则。
比如这种情况:
我们希望可以在B和C之间加一个F,Diff算法默认执行起来是这样的:
要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。
所以一句话,key的作用主要是为了高效的更新虚拟DOM。另外vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="app">
<ul>
<li v-for="item in list" :key="item.id">{{ item.name }} <input type="text"></li>
</ul>
</div>
<script src="./node_modules/vue/dist/vue.js"></script>
<script>
const vm = new Vue({
el: "#app",
data: {
list: [
{ id: 1, name: "张三" },
{ id: 2, name: "赵四" },
{ id: 3, name: "王五" },
]
}
});
</script>
</body>