面试题答案
一键面试虚拟DOM的diff算法核心原理
- 树结构对比:虚拟DOM以树状结构表示,diff算法通过对比新旧两棵虚拟DOM树,找出差异部分。在Vue中,会对新旧虚拟DOM树的根节点开始进行深度优先遍历,依次比较每一层的节点。
- 同级比较:比较过程中,只对同一层级的节点进行比较,而不会跨层级比较。例如,若一个节点从父节点A移动到父节点B,diff算法不会直接识别这种跨层级移动,而是当作节点在原层级被删除,在新层级被创建。
- 节点标识:为了更高效地对比,Vue为每个节点添加
key
属性作为唯一标识。在对比时,若节点类型相同且key
值相同,认为是同一节点,可复用节点,只更新节点属性;若key
值不同,即使节点类型相同,也会当作不同节点处理,直接删除旧节点并创建新节点。
在实际更新DOM操作时提高效率的方式
- 减少直接操作DOM次数:传统操作DOM非常消耗性能,而虚拟DOM通过diff算法先在JavaScript层面计算出最小的差异,然后批量将这些差异应用到真实DOM上,避免频繁直接操作真实DOM。例如,页面中有多个元素需要更新,若直接操作DOM,每次更新都可能触发重排重绘;而虚拟DOM计算出所有更新的差异后,一次性更新真实DOM,大大减少了重排重绘次数。
- 复用节点:利用
key
值判断节点是否可复用。对于可复用的节点,只更新其属性和文本内容,而不是重新创建和删除。比如列表渲染中,若列表项顺序变化但内容不变,通过key
可以复用旧列表项的DOM元素,仅调整其位置,而不是重新创建所有列表项的DOM,提升了更新效率。