8-2 函数式编程
纯函数(不可变值):返回一个新值
SCU
redux
8-3 vdom和diff
- h函数
 - vnode数据结构
 - patch函数
 
diff 优化:
- 只比较同一层级, 不跨级比较
 - tag不相同, 直接删除重建, 不再深度比较
 - tag和key, 两者都相同, 则认为是相同节点, 不再深度比较
 
8-4 JSX本质
jxs等同与vue模版, jxs不是js
- React.createElement即h函数,返回vnode
 - 第一个参数, 可能是组件, 可能是html、tag
 - 组件名, 首字母必须大写(tag是小写)
 
8-5 合成事件机制
优势:
- 更好的兼容性和跨平台
 - 载到document,减少内存消耗,避免频繁解绑
 - 方便事件的统一管理(如事务机制)
 
8-6 setState和batchUpdate机制
setState主流程
setState是异步还是同步?
- setState无所谓异步还是同步
 - 取决于是否能命中batchUpdate机制
 - 判断isBatchingUpdates
 
batchUpdate机制:
| 命中 | 不能命中 | 
|---|---|
- 生命周期 - React中注册的事件 - React可以管理入口  | 
- setTimeout、setInterval 等 - 自定义的DOM事件 - React管不到的入口  | 
8-7 transaction(事务)机制
transaction.initialize = function () { consle.log('initialize') }transaction.close = function() { consle.log('close') }function method() { consle.log('123') }transaction.perform(method); // initialize -> 123 -> close
8-8 组件渲染和更新过程
JSX如何渲染为页面? JSX 即createElement函数
- props state
 - render() 执行生成vnode
 - patch(elem, vnode)
 
setState之后如何更新页面?
- setState(newState) -> dirtyComponents(可能有子组件)
 - render()生成vnode
 - patch(vnode, newVnode)
 
8-9 React-fiber 性能优化
更新的(patch)两个阶段:
- reconciliation阶段(执行diff算法, 纯JS计算)
 - commit阶段(将diff结果渲染DOM)
 
可能存在的性能问题:
- JS是单线程, 且和DOM渲染共用一个线程
 - 当组件足够复杂, 组件更新时计算和渲染都压力大
 - 同时再有DOM操作请求(动画、鼠标拖动等),会有卡顿
 
解决方案fiber
- 将reconciliation阶段进行任务拆分(commit无法拆分)
 - DOM需要渲染时暂停, 空闲时恢复
 - window.requestIdleCallback
 
什么是fiber?是React内部运行机制。
