第一章理念篇——1.6 Hooks

147 阅读3分钟

本专栏致力于每周分享一个项目,如果本文对你有帮助的话,欢迎点赞或者关注☘️

React18 源码系列会随着学习 React 源码的实时进度而实时更新:约,两天一小改,五天一大改。

Hooks理念

React LOGO的图案是代表原子(atom)。与世间万物由原子组成的理念相似,在 React 的世界中,Component 就是一种原子单元,这些 Component 的属性与类型决定了 UI 的外观与表现。一般的,我们说ClassComponent是一类原子,而Hooks则是更贴近事物运行规律的电子。

React的架构遵循 schedule - render - commit 的运行流程,这个流程是 React 世界最底层的运行规律。ClassComponent作为 React世界的原子,他的生命周期(componentWillXXX/componentDidXXX)是为了介入 React 的运行流程而实现的更上层抽象,这么做是为了方便框架使用者更容易上手,相比于ClassComponent 的更上层抽象,Hooks 则更贴近 React 内部运行的各种概念(state | context | life-cycle)。

很多人总是习惯于总会拿 ClassComponent 的生命周期来类比 Hooks API 的执行时机,其实这两者的概念有很多割裂感,并不是同一抽象层次可以互相替代的概念,比如常见的,componentWillReceiveProps 是在render 阶段执行,而 useEffect 是在 commit 阶段完成渲染后异步执行。

Concurrent Mode 是 React 未来的发展方向,而 Hooks 是能够最大限度发挥 Concurrent Mode 潜力的Component 构建方式。

Hooks分类

  • useEffect:组件渲染后执行副作用操作,如API调用或设置事件监听器; useEffect 是在 commit 阶段完成渲染后异步执行,可以通过传递空数组来模拟componentDidMount、componentDidUpdate、componentWillUnmount的行为,不过需要注意他们并不是属于同一抽象层次可以互相替代的概念。
  • useState:允许你在函数组件中拥有状态;每当状态更新时,组件将重新渲染。
  • useContext:订阅Context的变化;当Context值变化时重新渲染。
  • useReducer:用于有复杂状态逻辑的组件;当action触发时重新渲染。
  • useCallback:返回一个memo化的回调函数;当依赖项改变时更新。
  • useMemo:将函数结果memo化;当依赖项改变时重新计算。
  • useRef:获得对DOM元素的引用,或用于保存任何可变值;在整个组件生命周期内保持不变。
  • useImperativeHandle:自定义实例值,让父组件控制子组件;通常与forwardRef一起使用。
  • useLayoutEffect:与useEffect类似,但在所有DOM更新前同步执行;用于需要同步更新DOM的操作。理解 useEffect 和 useLayoutEffect 的区别。
  • useDebugValue:用于调试,显示hook的当前值;仅在开发模式下有效。
  • useDeferredValue:用于处理某些状态的延迟更新,以优化性能和用户体验。在useDeferredValue内部会调用useState并触发一次更新。这次更新的优先级很低,所以当前如果有正在进行中的更新,不会受useDeferredValue产生的更新影响
  • startTransition: 允许将某些更新标记为低优先级,以提高页面的响应性能。

关于作者

作者:Wandra

内容:算法 | 趋势 |源码|Vue | React | CSS | Typescript | Webpack | Vite | GithubAction | GraphQL | Uniqpp。

专栏:欢迎关注呀🌹

本专栏致力于每周分享一个项目,如果本文对你有帮助的话,欢迎点赞或者关注☘️