Vue key

Key定义:

相同父元素里面子元素的独特标识,重复的key会造成渲染错误 

key的使用

当传入两个形参时第一个输出的时数组里面的对象 而index 输出的是数组对象的索引值.

当:key的值为 index时

结果

当:key的值为 id时

结果

小案例 (key=index);

当点击按钮在原有数组后添加新对象

(1)给每个 li 元素后添加一个 input 输入框并随便填入值


(2)点击添加时会发现 value 内容错乱了

(key为index)原理图:

(index作为key时)原理:

首先 vue 会根据用户创建的 vue 实例生成虚拟 DOM 进而转为用户可以看到的浏览器上显示的真实DOM

当点击添加按钮在原有数据之前添加新数据时 vue 会生成一个新的虚拟DOM

新的虚拟DOM与初始虚拟DOM进行对比,发现第一个li元素的内容发生变化,于是vue会将新的虚拟DOM的值转为真实的新的DOM。继续往下对比input里面的值会发现新DOM里面input里面没有值所以会直接将原有DOM里面input的值拿过来从而造成了input里面value的值发生错乱

如果没有手动为其添加key时vue会自动为其添加key值,当初始虚拟DOM与新虚拟DOM进行对比时新添加的元素会变为001从而导致两边虚拟DOM数据不一致而倒置BUG。当需要在原有元素之前添加新元素时并不建议使用index,在其之后添加并不会出现此BUG

(key为id)原理图:

(id作为key时)原理:

新DOM与初始DOM对比vue会发现初始DOM没有key为004的元素与之匹配所以会直接将之生成为新的真实DOM

继而往下发现有与之匹配的001,而自身input里面并没有内容所以会直接将初始真实DOM拿过来使用

总结:

1.虚拟DOM中key的作用;

(1)Key是虚拟DOM对象的标识,当状态中的数据发生变化时.vue会根据【新数据】生成【新的虚拟DOM】,随后vue进行新旧DOM的差异比较,规则如下


2.对比规则

(1)旧虚拟DOM中找到了与新虚拟DOM相同的key;

①若虚拟DOM中内容没变,直接使用之前的真实DOM
②若虚拟DOM中内容改变。则生成新的真实DOM,随后替换页面之前的真实DOM

(2)旧虚拟DOM中未找到与新虚拟DOM相同的key;

①创建新的真实DOM,随后渲染到页面中


3.用index作为key可能会引发的问题;

(1)若对数据进行:逆序添加,逆序删除等破坏顺序操作

会产生没有必要的真实DOM更新==>界面没有问题,但效率低。

(2)如果结构中还包含输入类(例如:index)的DOM

会产生错误DOM更新==>界面有问题


4.开发中如何选择key?

1.最好使用每条数据的唯一标识作为key,如id、手机号、身份证号、学号等唯一值
2.如果不存在对数据的逆序添加,逆序删除等破坏顺序的操作,仅用于渲染列表用于展示使用index作为key是没有问题的