ps:大体转载知乎文章vue
vue和react的虚拟dom都采用相似的diff算法,核心大概能够归为两点react
1,两个相同的组件产生相似的DOM结构,不一样的组件产生不一样的DOM结构;算法
2,同一层级的一组节点,他们能够经过惟一的id进行区分。dom
基于以上两点假设,是的虚拟的DOM的Diff算法的复杂程度从O(n^3)降到了O(n)。blog
当页面的数据发上变化的时候,Diff算法只会比较同一层级的节点:get
若是节点类型不一样,直接干掉前面的节点,在建立并插入新的节点,不会再比较这个节点之后的子节点了。io
若是节点类型相同,则会从新设置节点的属性,从而实现节点的更新。效率
当某一层有不少相同的节点时,也就是列表节点时,Diff算法的更新过程默认状况下也是遵循以上的原则。bfc
以下例子:im
咱们但愿在B和C之间加一个F,Diff算法默认执行起来是这样的
即把C更新成F,D更新成C,E更新成D,最后再插入E,是否是很没有效率?
因此咱们须要使用key来给每一个节点作一个惟一的标识,Diff算法就能够正确的识别此节点,找到正确的位置区插入新的节点。
因此一句话,key的做用就是为了搞笑的更新虚拟DOM。另外vue中在使用相同标签名元素的过分切换时,
也会使用到key属性,其目的也是为了让vue能够区分他们,不然vue只会替换其内部属性而不触发过渡效果。
ps:key最好不要用index,用单一的惟一的标记