一种前端的框架,其设计思想为:“响应式”

基于图灵机的计算机,永远是串行计算的过程。而前端的执行原则上就是:与用户响应的交互与刷新。

刷新十分重要。

React 实现“响应”的方式为对“状态”的函数映射。理解为:

  • UI 为 state 通过 f 函数的映射得到的

Reac 的刷新过程

为了实现以上的过程,React 执行过程,从前往后分为:

  • 渲染(Render):计算更改,即为 UI 的内容哪些地方需要更新。生成一个虚拟 DOM 和当前 DOM 做比较。会使用 DIFF 算法对比并找到更改。
    • 执行计算钩子:useState, useMemo, useCallback
    • 创建虚拟 DOM
    • DIFF:比较虚拟 DOM 和真实 DOM 并计算之间的更新
  • 提交(Commit):计算得到的结果应用到真实的页面元素DOM上。
    • DOM Mutation:更新 DOM 中的操作
    • Layout Effects:执行 useLayoutEffect
    • Paint 重绘,用户看到页面数据的更新
    • Ettfect:执行 useEffect

前者是纯计算过程,后者是纯应用过程。

关于钩子

钩子就是将一个计算过程抽象独立出来,使得结果可以被独立于渲染过程处理,部分结果还可以缓存避免重复计算。

不同的钩子使用方法声明,即为一个函数,在不同的执行阶段执行,有的还可缓存数据。

因为执行时机的不同,所以不同的钩子有不同的应用场景。

  • useState, useReducer:渲染执行
  • useMemo, useCallback:渲染阶段执行,检查依赖变化,如果变化则执行更新
  • useLayoutEffect:提交执行,DOM 更新之后,但是在重绘前。一般是需要读取 DOM 进行重绘的任务,可以避免闪烁
  • useEffect:提交执行,重绘之后。用途一般是 Fetch API,订阅,手动修改 DOM,日志