Vue中key的内部原理

101 阅读2分钟

虚拟DOM(Vnodes)中key的作用:

  1. key是虚拟对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】。
  2. 随后Vue通过对比算法(diff算法)进行【新虚拟DOM】和【旧虚拟DOM】的差异比较。

对比规则:

  1. 在旧虚拟DOM中找到与新虚拟DOM相同的key:
    (1)若虚拟DOM中内容没变,直接使用之前的真实DOM。
    (2)若虚拟DOM中内容变了,则生成新的真实DOM,随后替换掉页面中之前的真实DOM。
  2. 在旧虚拟DOM中未找到与新虚拟DOM相同的key:
    创建新的真实DOM,随后渲染到页面。

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

  1. 若对数据进行逆序添加、删除等破坏顺序的操作:会产生没有必要的真实DOM更新==>页面效果没有问题,但是效率慢。
  2. 如果结构中还包含输入类的DOM:会产生错误的DOM更新==>界面有问题。

abeafc0c445751453f214e7bcb58e82d6bf7b21003f53dd36087cec688fc6f4dQzpcVXNlcnNcaGFueWlcQXBwRGF0YVxSb2FtaW5nXERpbmdUYWxrXDEyMjYzMDMwODVfdjJcSW1hZ2VGaWxlc1wxNjY2ODUyMjQ4MjA5X0M0QjcyRkFELUFEMEQtNDIyZS04RTk0LTE3RDBDMTE5Nzk1MS5wbmc=.png 当数据更新时,Vue不会直接生成真实DOM,而是先将新旧虚拟DOM进行差异对比。按照对比规则,首先Vue在旧虚拟DOM中找到同为1key,而原先内容张三-18发生变化,则生成新的真实DOM刘六-40;而虚拟DOM的input输入框没变,则直接使用原来的真实DOM,其中的文本内容被一同渲染到页面。 a3e8ef846fdc207f20872f23a80dfb6c6f55c083b13f4619d7f1dfa471042b97QzpcVXNlcnNcaGFueWlcQXBwRGF0YVxSb2FtaW5nXERpbmdUYWxrXDEyMjYzMDMwODVfdjJcSW1hZ2VGaWxlc1wxNjY2ODUxODY3NDY0X0VBRUVDN0NGLURBMEUtNGViMy05MUJELUJFQjk3OEFDOUEyMC5wbmc=.png 由于旧虚拟DOM中未找到key值为3的DOM,所以Vue直接创建新的真实DOM,随后渲染到页面。 d918aaa60acd79b3968942506c283d5efcb975b6c0c4e2386dfbdd70787bb0a1QzpcVXNlcnNcaGFueWlcQXBwRGF0YVxSb2FtaW5nXERpbmdUYWxrXDEyMjYzMDMwODVfdjJcSW1hZ2VGaWxlc1wxNjY2ODUxOTQwNjY0X0RGRkE3QjU0LTQwRDEtNDY1ZS1BODkzLUU5MDk0MTlCOTlDRS5wbmc=.png 以上就是用index作为key且包含输入类的DOM会引发的DOM更新。

开发中如何选择key

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