[聚焦React] 8 React原理 - 图18-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 合成事件机制
    image.png优势:

    • 更好的兼容性和跨平台
    • 载到document,减少内存消耗,避免频繁解绑
    • 方便事件的统一管理(如事务机制)

    8-6 setState和batchUpdate机制
    setState主流程
    image.png
    setState是异步还是同步?

    • setState无所谓异步还是同步
    • 取决于是否能命中batchUpdate机制
    • 判断isBatchingUpdates

    batchUpdate机制:

    命中 不能命中

    - 生命周期
    - React中注册的事件
    - React可以管理入口

    - setTimeout、setInterval 等
    - 自定义的DOM事件
    - React管不到的入口

    8-7 transaction(事务)机制
    image.png

    1. transaction.initialize = function () { consle.log('initialize') }
    2. transaction.close = function() { consle.log('close') }
    3. function method() { consle.log('123') }
    4. 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内部运行机制。