vlambda博客
学习文章列表

虚拟DOM中key值的作用

 虚拟DOM中的key是用来做什么的,为什么Vue中使用v-for指令渲染长列表是不推荐使用index作为key值?



01


什么是虚拟DOM


虚拟DOM就是一棵以JavaScript对象构建的,用来描述DOM结构的树,是对浏览器真实DOM的抽象。虚拟节点通过对象属性来描述DOM,通过特定的方法,将虚拟节点绘制到真实环境浏览器中。

在Vue中,一个虚拟DOM节点的属性有:



通常,一个虚拟DOM节点对象包含标签类型tag、子元素children、DOM属性(类名、id等)data、对应在DOM中的引用ele、其他属性以及我们在本篇中着重要分析的key。


假设我们有如下HTML结构:

<ul class="list"> <li>1<li> <li>2<li></ul>

用JavaScript对象描述如下:

{  tag: 'ul',  data: {   class: ['list']  },  children: [    {      tag: 'li',      data: undefined,      children: undefined,      text: '1',      key: undefined    },    { tag: 'li', data: undefined, children: undeifned, text: '2', key: undefined }  ],  text: undefined,  key: undefined }


02


Vue中虚拟DOM的diff算法


通过对Vue源码的学习,我们知道在Vue中,视图的更新是组件级别的。在实例化一个组件的时候,我们可以传入template或自定义render函数来完成组件视图的构建。对于传入template的这种情况,Vue会对其进行编译,生成AST树,根据AST树来生成render函数,将render函数赋值给vm实例属性_render。从源码中可以看到,在实例化组件渲染watcher的时候,会传入一个updateComponent函数,当依赖发生变化的时候,会重新调用updateComponent函数,生成新的vnode,patch到DOM上。