调用render 时,DOM一定会更新吗,为什么?
不一定。调用 render() 并不意味着 DOM 一定会更新。
React 的渲染流程:
在 React 中,“渲染(render)”分为两步:
Render Phase(渲染阶段)
-
调用组件的 render()(类组件)或函数组件本体
-
得到新的虚拟 DOM(Virtual DOM)
Commit Phase(提交阶段)
-
React 比较新旧虚拟 DOM(Diff)
-
只有发生变化的部分才会真正更新到真实 DOM
所以:
render() 调用 ≠ DOM 更新
当 render 被调用时,只是产生新的虚拟 DOM。
React 会通过 Diff 判断是否需要实际的 DOM 操作。
DOM 什么时候不会更新?
1. PureComponent / React.memo 阻止 rerender
如果 props 和 state 没变化,根本不会进入 render。
2. render 生成的虚拟 DOM 与上一次一致
即使调用 render,虚拟 DOM 没变,React 也不会更新真实 DOM
3. 父组件重新渲染但子组件使用 memo 或 shouldComponentUpdate
子组件不会 DOM 更新。
4. setState 更新相同值
this.setState({ count: 1 });
this.setState({ count: 1 });
React 会跳过 DOM 更新。
结论
render 调用只代表“虚拟 DOM 重新生成”,不保证真实 DOM 会更新。
React 必须在 diff 后判定有变化,才会执行真实 DOM 更新。
浙公网安备 33010602011771号