一、虚拟 DOM 是什么?
一个能代表DOM树的对象,通常含有标签名、标签上的属性、事件监听和子元素们,以及其他属性。
二、虚拟 DOM有什么优点?
1、能减少不必要的DOM操作(两个例子)
2、能跨平台渲染
三、虚拟 DOM有什么缺点?
需要额外的创建函数,如createElement 或 h ,但可以通过JSX来简化成XML写法。
四、DOM diff 是什么(diff对比)
虚拟DOM的对比算法
1、DOM diff就是一个函数,称之为patch
patches = patch(oldVNode, newVNode)
patches 就是要运行的DOM操作。
2、DOM diff 可能的大概逻辑
- Tree diff 把虚拟DOM想象成DOM树,将新旧两颗树逐层对比,找出哪些节点需要更新。
如果节点是组件就看Component diff
如果节点是标签就看Element diff
- Component diff 如果节点是组件,就先看组件类型
类型不同直接替换(删除旧的)
类型相同则只更新属性
然后深入组件做Tree diff(递归)
- Element diff
如果节点是原生标签,则看标签名
标签名不同直接替换,相同则只更新属性
然后进入标签后代 做 Tree diff(递归)
一个页面的节点大概2000-10000个
五、DOM diff 的优点
DOM diff其实就是一个函数,它会对比 oldNode 与 newNode 的区别。从而减少不必要的渲染。
六、DOM diff 的问题(key)
同级比较存在bug,解决办法是给每个节点一个唯一的id作为 key,让计算机根据这个 key ,知道我们操作的是哪个 DOM 。
深入阅读
React 虚拟 Dom 和 diff 算法 juejin.cn/post/684490…
React 源码剖析系列 - 不可思议的 react diff zhuanlan.zhihu.com/p/20346379
Vue2.0 v-for 中 :key 到底有什么用? www.zhihu.com/question/61…