一种前端的框架,其设计思想为:“响应式”
基于图灵机的计算机,永远是串行计算的过程。而前端的执行原则上就是:与用户响应的交互与刷新。
刷新十分重要。
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,日志