1. JSX代码如何转化为DOM
JSX是JavaScript的语法扩展,会被Babel编译为React.createElement()
函数调用,该函数返回一个称为"React Element"的JavaScript对象。Babel作为工具链,主要用于将ECMAScript 2015+代码转化为向后兼容的JavaScript语法,以支持旧版浏览器。JSX语法允许开发者使用类似HTML的标签语法,降低学习成本并提升研发效率。
关键点:
-
createElement
函数需要三个参数:•
type
: 标识节点类型(如组件或HTML标签)。•
config
: 以对象形式传入,存储组件的所有属性(键值对)。•
children
: 以对象形式传入,记录组件标签间的嵌套内容。

-
ReactDOM.render
参数说明:-
element
: 需要渲染的React Element。 -
container
: 元素挂载的目标容器(真实DOM节点)。
-
[callback]
: 可选回调函数,用于处理渲染结束后的逻辑。go整体转化流程:JSX → `createElement`→ React Element → `ReactDOM.render`→ 真实DOM。
-
2. React生命周期详解
生命周期描述了组件从初始化到更新或卸载的全过程,核心是渲染工作流的"封闭"和"开放"特性:
-
封闭:每个组件仅处理内部渲染逻辑。
-
开放:基于单向数据流原则实现组件间通信,通过数据变更影响渲染结果。
生命周期方法(如
render
)构成了组件的"灵魂"与"躯干"。
React 15生命周期过程
-
父组件导致子组件重新渲染时,即使props未更改,也会触发
componentReceiveProps
(非props变化驱动)。 -
shouldComponentUpdate
返回值决定是否执行后续生命周期及重渲染。 -
componentWillUnmount
触发条件:-
组件在父组件中被移除。
-
父组件render中key值与上一次不一致。
-
React 16生命周期过程
-
废除
componentWillMount
,新增getDerivedStateFromProps
。 -
render
方法改进:支持返回元素数组或字符串(React 16前仅支持单个元素)。 -
getDerivedStateFromProps
用途:-
仅用于派生/更新state(非依赖组件,无法访问
this
)。 -
接收
props
和state
参数,返回对象(无返回值需return null
)。 -
更新机制为定向属性更新(非整体覆盖)。
-
-
组件初始化渲染(挂载)对比:
-
组件更新流程对比:
-
getDerivedStateFromProps
替代componentReceiveProps
(不等价)。 -
移除
componentWillUpdate
,新增getSnapshotBeforeUpdate
:-
执行时机在
render
后、真实DOM更新前。 -
返回值作为参数传递给
componentDidUpdate
,用于获取更新前的真实DOM及state/props。
-
-
3. Fiber架构核心原理
Fiber是React 16对核心算法的重写,旨在解决同步渲染导致的性能问题:
-
•将同步渲染变为异步(仅在Concurrent模式下)。
-
•拆解大更新任务为小任务,支持中断、恢复和优先级调度。
-
•将生命周期划分为
render
(可中断)和commit
(同步执行)两阶段。
影响与变更:
-
废除API:
componentWillMount
、componentWillUpdate
、componentWillReceiveProps
(因异步渲染可能导致多次请求或数据不一致)。 -
动机:配合异步渲染机制,确保数据安全性和生命周期行为的可预测性。
-
初始化阶段流程:
-
请求当前Fiber节点的lane(优先级)。
-
创建update对象。
-
调节当前节点(root Fiber)。
-
Render阶段工作流
-
WorkInProgress节点创建:
-
createWorkInProgress
生成新节点,与current节点通过alternate
互指。 -
循环调用
performUnitOfWork
触发beginWork
创建Fiber树。
-
-
beginWork逻辑 :基于Fiber节点的
tag
属性调用不同创建函数。 -
childReconciler作用 :处理Fiber节点的创建、增删改(如
placeXXX
、deleteXXX
)。 -
effectList设计:
-
记录需处理的副作用(如DOM变更)。
-
实现原理:Fiber节点的
flags
属性(旧称effectTag
)标识副作用类型(如placement
表示新增DOM节点)。
-
-
Fiber树创建过程:
Commit阶段工作流
-
before mutation
:DOM未渲染前的逻辑。 -
mutation
:负责DOM渲染。 -
layout
:处理DOM渲染后的收尾工作。 -
最终将Fiber树的
current
指针指向workInProgress
树。
4. React组件数据流动
单向数据流
-
数据流向:父组件 → 子组件(通过props传递)。
-
实现方式:
-
父组件通过props传递数据或函数(子组件调用函数以参数形式返回数据)。
-
兄弟组件通信:需通过父组件中介。
-
发布-订阅模式(EventBus)
-
• 示例:Socket.io或Node.js的EventEmitter。
-
API设计:
-
on()
:注册事件监听器。 -
emit()
:触发事件(可携带数据)。 -
off()
:移除监听器。
-
Context全局通信
-
作用:跨层级组件数据传递。
-
实现:
React.createContext
创建Provider和Consumer。 -
问题:过时Context代码不优雅,新版本确保数据一致性(即使
shouldComponentUpdate
返回false
)。
5. Redux核心概念
Redux是JavaScript状态容器,提供可预测的状态管理:
-
组成:
-
store
:单一数据源(只读)。 -
action
:描述变化的对象(type
为必填唯一标识)。 -
reducer
:处理action并更新状态。
-
-
原则:state变更必须由action驱动。
6. React Hooks设计
Hooks是使函数组件更强大的"钩子",本质是一个链表:
函数组件 vs 类组件
-
类组件 :继承class、访问生命周期、维护state、使用
this
。 -
函数组件 :轻量、无生命周期、无
this
、更契合React声明式理念(数据与渲染绑定)。
核心Hooks:
-
useState
:返回状态变量和更新函数(mountState初始化,updateState更新)。 -
useEffect
:弥补生命周期缺失(回调中返回清除函数)。
问题与原则:
-
问题:无法完全替代类组件能力,复杂性处理较弱。
-
使用原则:
-
仅在React函数中调用Hook。
-
避免在循环、条件或嵌套函数中调用。
-
确保Hooks执行顺序一致。
-
7. 虚拟DOM与diff算法
虚拟DOM是描述DOM结构的JS对象,优化渲染性能:
-
工作流:
-
挂载阶段:JSX → 虚拟DOM树 →
ReactDOM.render
→ 真实DOM。 -
更新阶段:变更作用于虚拟DOM → diff算法对比差异 → 差量更新真实DOM。
-
-
价值:
-
提升研发体验与效率。
-
支持跨平台渲染(Web、iOS、Android)。
-
实现批量更新。
-
diff算法原理:
-
分层对比:仅同层级节点比较。
-
类型一致:节点类型相同才继续diff。
-
key优化:重用同层级节点。
-
树递归:基于key进行深度比较。
8. setState工作流
-
行为差异:
-
异步:在React钩子函数和合成事件中。
-
同步:在
setTimeout
、setInterval
或原生DOM事件中(因逃脱React管控)。
-
-
Transaction机制 :封装方法(如
initialize
、perform
),确保更新原子性。
9. React事件系统
原生DOM事件流
-
三阶段:事件捕获 → 目标阶段 → 事件冒泡。
-
事件委托:合并子元素监听逻辑到父元素。
React事件流实现
-
绑定:通过
completeWork
完成。 -
特点:document上统一事件分发函数(多次调用仅触发一次)。
-
合成事件:封装原生事件,提供跨浏览器一致性。