React原理
一、函数式编程
- 一种编程范式,概念比较多
- 纯函数
- 不可变值
二、vdom和diff
参考 vue vdom diff
三、JSX的本质
JSX
被 babel
编译成 React.createElment
函数
React.createElement(
tag<string> | component<function component | class component | string>,
data<object>,
...child<function component | class component | string> | array<function component | class component | string>)
1
2
3
4
2
3
4
四、合成事件
- 所有事件挂载到 document 上(React17挂载到 root 组件上)
- event 不是原生的,是 SyntheticEvent 合成事件对象
- 和 Vue 事件不同,和 DOM 事件也不同
1. 合成事件机制
2. 合成事件机制的背景
- 更好的兼容性和跨平台
- 挂载到 document 上,减少内存消耗,避免事件频繁绑定和解绑
- 方便事件的统一管理(如事务机制)
五、setState 和 batchUpdate
1. setState
- 有时异步(普通使用),有时同步(setTimeout、DOM 事件)
- 有时合并(对象形式),有时不合并(函数形式)
- 后者比较好理解(像 Object.assign),主要讲解前者
2. setState主流程
3. batchUpdate机制
4. transaction事务机制
六、组件渲染和更新过程
1. 组件渲染过程
- props state
- render() 生成 vnode(将 JSX 编译成 React.createElement,返回 vnode)
- patch(elem, vnode)
2. 组件更新过程
- setState(newState) --> dirtyComponents(可能有子组件)
- render() 生成 newVnode
- patch(vnode, newVnode)
3. 更新(patch)的两个阶段
- reconciliation 阶段 - 执行 diff 算法,纯 JS 计算
- commit 阶段 - 将 diff 结果渲染到 DOM