为什么每次状态改变,都需要重新生成一个完整的虚拟dom?*
- 不是生成一个完整虚拟dom,只是在调和阶段从根节点开始进行遍历而已。
- 从根节点diff遍历,本身就是一种设计上的简化,不然就得确定到底是哪个节点受影响了,有几个节点受影响了, 状态变化也会有useState/useContext多种种类,倒不如直接从根节点一遍过,虽然会牺牲一点点的遍历时性能,但无关紧要。
- React会使用Bailout策略,如果React在某个节点的渲染过程中确定该节点没有发生变化(根据childLines对比), 就会放弃(bailout)继续对该节点进行深度比较。从这个方面来说,并没有生成一个完整的虚拟dom,倒不如说是更新虚拟dom。
- 在commit阶段,实际上是通过updateQueue进行更新的,可以理解为一个队列,里面存放着需要更新的节点。 也就是说在提交阶段是从受影响的组件开始遍历,而不是从根节点进行遍历。