React/Vue 项目时为什么要在组件中写 key,其作用是什么?
vue和react都是采用diff算法来对比新旧节点,从而更新节点。key的作用是为了在执行 diff算法 的时候,更快的找到对应的节点,提高diff速度。
没有 Key 值的问题
老集合中包含节点:A、B、C、D,更新后的新集合中包含节点:B、A、D、C,此时新老集合进行 diff 差异化对比,发现 B != A,则创建并插入 B 至新集合,删除老集合 A;以此类推,创建并插入 A、D 和 C,删除 B、C 和 D。
因为这些都是相同的节点,但由于位置发生变化,导致需要进行繁杂低效的删除、创建操作,其实只要对这些节点进行位置移动即可。
针对这一现象,提出优化策略:允许开发者对同一层级的同组子节点,添加唯一 key 进行区分,虽然只是小小的改动,性能上却发生了翻天覆地的变化!
有key
1.对新集合的节点进行遍历,通过唯一 key 可以判断新老集合中是否存在相同节点。
2.如果存在相同节点,则进行移动操作,但在移动前,需要将当前节点在老集合中的位置与 lastIndex 进行比较,如果不同,则进行节点移动,否则不执行该操作。