一句话总结:React15 是 Stack Reconciler(同步递归、不可中断);React16 换成 Fiber Reconciler(可中断、可调度、优先级),是底层大重构,同时新增一堆API
- 底层协调算法(最大区别)
✅ React15:Stack Reconciler
-
递归同步diff,一旦开始渲染,不能中断,必须一次性整棵树走完
-
任务时间长就阻塞主线程 → 页面卡顿、输入延迟、动画掉帧
-
没有任务优先级概念
✅ React16:Fiber Reconciler
-
把虚拟DOM拆成一个个Fiber节点,任务分片;可中断、可恢复、可优先级调度
-
协调阶段(render)和提交阶段(commit)分开:
-
render:可中断,纯计算,不碰DOM
-
commit:一次性同步执行,操作DOM,不可中断
-
为后面 Concurrent Mode、Suspense、Hooks 打下基础
⚠️ React16 默认还是同步渲染,只是底层架构支持异步可中断,并发模式在16里只是实验性的
- render 返回值变化(高频考点)
-
React15: render 只能返回单个根元素,多节点必须包一层 <div>
-
React16:
-
可以返回数组、字符串、数字、null、布尔值
-
支持 Fragment( <></> ),不用额外DOM包裹
jsx
// React16允许
render() {
return [
<p key="1">a</p>,
<p key="2">b</p>
]
}
- Error Boundary 错误边界(新增)
-
React15:子组件渲染报错 → 整个应用崩溃,状态错乱,只能刷新
-
React16:新增 componentDidCatch / static getDerivedStateFromError ,错误边界可以捕获子树渲染、生命周期、构造函数里的错误,展示降级UI,局部崩溃不炸全页
注意:不能捕获事件回调、异步代码、自身抛出的错误
- Portals 传送门(新增)
ReactDOM.createPortal(child, container)
-
React15:组件渲染出来的DOM一定在父组件DOM层级内,弹窗、tooltip 容易被 overflow:hidden 、z-index 截断
-
React16:可以把组件渲染到任意DOM节点,但事件冒泡依然遵循React组件树,而不是真实DOM树,非常适合弹窗
- 生命周期改动(重点)
React15 旧生命周期:
componentWillMount / componentWillReceiveProps / componentWillUpdate (常叫3个will)
React16:
-
这三个 will 生命周期在Fiber下不安全(render阶段可中断,可能多次执行)
-
16.3 引入新生命周期: getDerivedStateFromProps 、 getSnapshotBeforeUpdate
-
标记三个will为不安全,后续版本逐步废弃
-
执行顺序、触发时机和15有差异, setState 回调时机也变了
- setState 行为差异
-
React15: setState(null) 依然触发更新
-
React16: setState(null) 不触发更新,方便在updater函数里决定要不要更新
-
setState是批量更新,但批量规则在Fiber下有变化(合成事件内批量,原生事件/setTimeout里不批量)
- SSR 服务端渲染
React15: ReactDOMServer.renderToString 同步渲染,大页面阻塞
React16:支持流式SSR renderToNodeStream ,分段输出HTML,首屏更快
-
其他小差异
-
ref:字符串ref逐渐不推荐,推荐 createRef / 函数ref(16.3正式推出 React.createRef )
-
事件系统:底层事件池在React17才移除,16还保留事件池
-
包拆分:React、ReactDOM拆分开,和15一致;但内部模块重构
-
返回 false 不再阻止渲染,16只认可渲染类型
快速对比表
特性 React15 React16
协调器 Stack,同步递归、不可中断 Fiber,分片、可中断、优先级
render返回 只能单个元素 数组、字符串、Fragment
错误处理 子组件报错整页崩 Error Boundary 局部降级
传送门 无 Portal
生命周期 3个will正常使用 标记will不安全,新增getDerivedStateFromProps
setState(null) 触发更新 不触发更新
SSR 同步renderToString 支持流式renderToNodeStream
如果你需要,我可以再给你一份面试背诵精简版,或者讲 Fiber 协调+commit阶段的详细流程。