[ 前端 与 React -1 | 青训营笔记 ]

77 阅读2分钟

React

React 哲学_更新流程

image-20230509152904432.png Scheduler (调度器)

  • 维护时间切片(类似requestIdleCallback)
  • 与浏览器任务调度
  • 优先级调度

Reconciler (协调器)

  • 将 JSX 转化为 Fiber
  • Fiber 树对比(双缓存)
  • 确定本次更新的 Fiber

Render (渲染器)

  • 渲染器用于管理一棵 React 树,使其根据底层平台进行不同的调用

用 React 开发 web 应用

image-20230509153747333.png 架构: 打包配置:JSX -> babel -> JS 加载优化和错误降级。

路由: React Router 向应用中快速地添加视图和数据流,保持页面与URL 间的同步。

UI: 可复用UI -> 组件 -> 页面。可复用逻辑抽离成 hook 。

状态: 多页面多组件共享信息 redux & context。

用 React 开发 web 应用_组件

image-20230509154303520.png 数据: 通过定义 state 操作视图

Mount 时获取数据更新 stateRef 保存与视图无直接关系的值

unMount 前清空 Ref

通信: props 父子组件通信

context & redux 组件信息共享

性能 函数使用 useCallback

值或者计算使用 useMemo

组件包裹 memo

UI 数据决定视图

通过 Ref 获取到 DOM

组件

image-20230509155406940.png

函数式 相较于 Class 的优点

  • 代码量骤减,组件干净清爽
  • 没有复杂的生命周期
  • 支持自定义 hook ,逻辑复用方便。

组件 和 hook 的关系

  • 将 UI 拆成多个独立单元,这些单元组合可以构成多种视图展示,这些独立单元就是组件。组件相当于原子。
  • hook 贴近组件内部运行的各种概念逻辑,effect、state、context等。hooks 更贴近于电子。

Hook 过期闭包问题

    function createIncrement(i) {
        let value = 0;

        function increment() {
            value += i;
            console.log(`Increment value is ${value}`);
            const message = `LogValue is ${value}`;

            function logMessage() {
                console.log(message);
            }
            return logMessage;
        }

        return increment;
    }

    const inc = createIncrement(1);
    const log = inc(); // Increment value is 1
    inc(); // Increment value is 2
    inc(); // Increment value is 3
    log(); // LogValue is 1

在JS中,函数运行的上下文是由定义的位置决定的,当函数的闭包包住了旧的变量值时,就出现了过期闭包问题。

function WatchCount() {
    const [count, setCount] = useState(0)
    
    useEffect(() => {
        const id = setInterval(() => {
            console.log(`Current Count is ${count}`);
        }, 1000);
        
        return () => clearInterval(id);
    }, []);
    
    const increment = () => setCount(count + 1);
    return (
        <div>
            {count}
            <Button onClick={increment}>Increment</Button>
        </div>
    )
}

----end----