React 的核心原理主要围绕以下几个方面:
1. 虚拟DOM (Virtual DOM)
1 2 3 4 5 6 7 8 9 10 11 12 13
| const virtualDOM = { type: 'div', props: { className: 'container', children: [ { type: 'h1', props: { children: 'Hello' } } ] } }
|
工作原理:
- React 创建虚拟DOM树(轻量级的JS对象)
- 状态变化时,生成新的虚拟DOM树
- 通过Diff算法比较新旧树的差异
- 批量更新实际DOM(最小化操作)
2. Diffing算法(协调算法)
React 使用 O(n) 复杂度的启发式算法:
比较策略:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| if (old.type !== new.type) { }
if (old.type === new.type) { updateProperties(oldNode, newNode); }
<ul> <li key="a">A</li> <li key="b">B</li> </ul>
|
Diff规则:
- 同级比较:只比较同一层的节点
- Key的重要性:帮助React识别元素的移动、添加、删除
- 类型不同则重建:元素类型改变,整个子树重建
3. Fiber架构(React 16+)
1 2 3 4 5 6 7 8 9 10
| const FiberNode = { type: FunctionComponent | ClassComponent | HostComponent, stateNode: Component实例 | DOM节点, return: 父Fiber, child: 第一个子Fiber, sibling: 兄弟Fiber, alternate: 上次渲染的Fiber, effectTag: 需要执行的副作用(PLACEMENT, UPDATE, DELETION等) }
|
Fiber核心概念:
- 增量渲染:将渲染工作拆分成多个小任务
- 可中断:React可以暂停、恢复渲染
- 优先级调度:为不同类型的更新分配优先级
4. 渲染流程
初始化渲染:
1 2 3 4
| 1. JSX → React.createElement() → 虚拟DOM对象 2. 创建Fiber树(协调阶段) 3. 计算DOM更新(提交阶段) 4. 实际DOM操作
|
更新过程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| setState(newState);
requestIdleCallback(() => { });
workLoop(deadline) { while (有工作 && 有空闲时间) { performUnitOfWork(currentFiber); } }
commitRoot();
|
5. Hooks原理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| let hookIndex = 0; let workInProgressHook = null;
function useState(initialState) { const hook = { memoizedState: initialState, queue: [], next: null }; return [hook.memoizedState, dispatchAction]; }
function dispatchAction(queue, action) { const update = { action, next: null }; scheduleUpdate(); }
|
Hooks规则:
- 只能在函数组件顶层调用
- Hook调用顺序必须稳定(基于链表实现)
- 每个Hook有独立的内存单元
6. 事件系统
React使用合成事件(SyntheticEvent):
1 2 3 4 5 6 7 8 9 10 11 12
| document.addEventListener('click', dispatchEvent);
function SyntheticEvent(nativeEvent) { this.nativeEvent = nativeEvent; this.currentTarget = null; this.persist(); }
|
7. 组件更新机制
类组件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Component { setState(partialState, callback) { this.updater.enqueueSetState(this, partialState, callback); scheduleUpdate(); } shouldComponentUpdate(nextProps, nextState) { return true; } }
|
函数组件:
1 2 3 4 5 6 7 8 9 10 11 12
| function MyComponent(props) { const [state, setState] = useState(); useEffect(() => { return () => { }; }, [dependencies]); }
|
8. 性能优化原理
React.memo:
1 2 3 4 5 6 7
| const MemoComponent = React.memo( MyComponent, (prevProps, nextProps) => { return prevProps.id === nextProps.id; } );
|
useMemo/useCallback:
1 2 3 4 5 6 7 8 9 10 11
| const memoizedValue = useMemo( () => computeExpensiveValue(a, b), [a, b] );
const memoizedCallback = useCallback( () => { doSomething(a, b); }, [a, b] );
|
9. 新的并发特性(React 18+)
Concurrent Mode:
1 2 3 4 5 6 7 8 9 10
| const root = ReactDOM.createRoot(container);
startTransition(() => { setState(newState); });
const deferredValue = useDeferredValue(value);
|
10. 核心优势
- 声明式编程:描述UI应该是什么样子
- 组件化:高内聚、低耦合
- 一次学习,随处编写:React Native、React VR
- 强大的生态系统
理解这些原理有助于:
- 编写更高效的代码
- 更好的性能优化
- 避免常见错误
- 理解React生态系统中的其他库
11. 流程总结
