虚拟DOM(Vnodes)中key的作用:
- key是虚拟对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】。
- 随后Vue通过对比算法(
diff算法)进行【新虚拟DOM】和【旧虚拟DOM】的差异比较。
对比规则:
- 在旧虚拟DOM中找到与新虚拟DOM相同的key:
(1)若虚拟DOM中内容没变,直接使用之前的真实DOM。
(2)若虚拟DOM中内容变了,则生成新的真实DOM,随后替换掉页面中之前的真实DOM。 - 在旧虚拟DOM中未找到与新虚拟DOM相同的key:
创建新的真实DOM,随后渲染到页面。
用index作为key可能会引发的问题
- 若对数据进行逆序添加、删除等破坏顺序的操作:会产生没有必要的真实DOM更新==>页面效果没有问题,但是效率慢。
- 如果结构中还包含输入类的DOM:会产生错误的DOM更新==>界面有问题。
当数据更新时,Vue不会直接生成真实DOM,而是先将新旧虚拟DOM进行差异对比。按照对比规则,首先Vue在旧虚拟DOM中找到同为
1的key,而原先内容张三-18发生变化,则生成新的真实DOM刘六-40;而虚拟DOM的input输入框没变,则直接使用原来的真实DOM,其中的文本内容被一同渲染到页面。
由于旧虚拟DOM中未找到
key值为3的DOM,所以Vue直接创建新的真实DOM,随后渲染到页面。
以上就是用index作为key且包含输入类的DOM会引发的DOM更新。
开发中如何选择key
- 最好使用每条数据的唯一标识作为key,比如id、手机号、身份证号、学号等唯一值。
- 如果不存在对数据的破坏顺序的操作,仅用于渲染列表用于展示,是可以用index作为key的。