原始数据:[{id:1,name:1},{id:2,name:2},{id:3,name:3},{id:4,name:4}]
更新数据:[{id:4,name:4},{id:3,name:3},{id:1,name:1}]
vue利用key来进行differ过程是怎样的,不带key是直接就地更新,加上key是怎么做的
原始数据:[{id:1,name:1},{id:2,name:2},{id:3,name:3},{id:4,name:4}]
更新数据:[{id:4,name:4},{id:3,name:3},{id:1,name:1}]
vue利用key来进行differ过程是怎样的,不带key是直接就地更新,加上key是怎么做的
key
,则vue
不知道元素的映射关系,只能按顺序对比vnode
。以简单的span
元素为例例子,patch
的过程是oldVnode1
和newVnode1
对比,dom1
需要更改text
,oldVnode2
和oldVnode2
对比等等,上诉例子中需要进行3次dom
更改以及1次dom
删除。key
,则vue
知道oldVnode1
应该和newVnode3
对比,即只需要删除1次dom
和移动1次dom
。1
的优点是会尽可能复用元素,但尽可能的复用元素可能并不是最佳的优化方案。这里仅仅只是以span
举例,如果还有很多children
或者干脆是个component
,则没有映射关系的对比,对比的目标不是你想要的目标会有多麻烦。所以除非你有自己的优化方案,否则for
循环尽量用key
,这也是 eslint-plugin-vue 的规范。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
2 回答4.7k 阅读✓ 已解决
4 回答4.3k 阅读✓ 已解决
加key 是删除节点 然后重新创建节点
不加key 是直接替换节点内容