- 为什么需要 Hooks ?
- React 组件之间不会互相继承,我们不推荐创建一个 Button 组件,然后再创建一个 Dropdown Button 来继承 Button
- 所有 ui 都是状态驱动,很少在外部去调用一个类实例(即组件)的方法。组件的所有方法都是在内部调用,或者作为生命周期方法被自动调用。
- 函数组件无法存在内部状态,必须是纯函数,而且也无法提供完整的生命周期机制,极大限制了函数组件的大规模使用。
- 函数和对象不同,没有一个实例的对象能够在多次执行之间保持状态,势必需要一个函数之外的空间保存这个状态,而且要检测其变化,从而能够触发函数组件的重新渲染。
- 为了更好的逻辑复用。
- 状态管理 Hooks
- useState:用于在函数组件中添加局部状态。
- useReducer:用于管理复杂的状态逻辑,类似于 Redux 的 reducer。
- useCallback
- useMemo
- 副作用 Hooks
- useEffect:用于在函数组件中执行副作用操作(如数据获取、订阅、手动 DOM 操作等)
- useLayoutEffect:与 useEffect 类似,但在 DOM 更新后同步执行,适用于需要直接操作 DOM 的场景
- 上下文 Hooks
- useContext:用于访问 React 的上下文
- 引用 Hooks
- useRef:用于创建一个可变的引用对象,通常用于访问 DOM 元素或存储可变值
- 性能优化 Hooks
- useMemo:用于缓存计算结果,避免在每次渲染时重新计算
- useCallback:用于缓存回调函数,避免在每次渲染时都创建新的回调。
- 其它 Hooks
- useDeferredValue: 延迟更新 UI 的某些部分。
- useActionState: 根据某个表单动作的结果更新 state。
- useImperativeHandle: 用于自定义暴露给父组件的实例值,通常与 forwardRef 一起使用。主要用于父子组件传递
- useDebugValue: 用于在 React 开发者工具中显示自定义 Hook 的标签。
- useOptimistic 帮助你更乐观地更新用户界面
- useTransition: 用于标记某些状态更新为“过渡”状态,允许你在更新期间显示加载指示器。
- useId: 用于生成唯一的 ID,可以生成传递给无障碍属性的唯一 ID。
- useSyncExternalStore: 用于订阅外部存储(如 Redux 或 Zustand)的状态。
- useInsertionEffect: 为 CSS-in-JS 库的作者特意打造的,在布局副作用触发之前将元素插入到 DOM 中
- 自定义 Hooks
- useCount
- useRequest
- hooks 定义规则:
- 所有 hook 必须被执行到,也就是不能放在判断条件中
- 所有 hook 必须按照顺序执行。
- 四个典型的使用场景
- 抽取业务逻辑
- 封装通用逻辑
- 监听浏览器状态
- 拆分复杂组件