什么是Hooks?
在React之前,组件之间的状态共享和复用是一个比较困难的问题。React的组件化开发模式使得组件的复用变得更加容易,但是在处理一些复杂的状态逻辑时,仍然需要使用一些高阶组件、render props等技术来实现。 React Hooks 是 React 16.8 引入的一种新特性,它可以让函数式组件拥有类组件的一些状态和生命周期的能力。使用 Hooks 可以让 React 应用的代码更加简洁和易于理解。
Hooks汇总
| Hook | 优点 | 缺点 | 适用场景 | 用法 |
|---|---|---|---|---|
| useState | 管理组件状态,简单易用 | 不必要的重复操作 | 单个状态管理 | const [state, setState] = useState(initialState); |
| useReducer | 管理复杂状态逻辑,适用于多个状态变量 | 需要定义和理解额外的reducer函数 | 复杂状态管理 | const [state, dispatch] = useReducer(reducer, initialState); |
| useContext | 共享全局数据,避免props层层传递 | 只适用于共享上下文的场景,可能引起组件之间的耦合 | 全局数据共享 | const value = useContext(MyContext); |
| useEffect | 执行副作用操作,灵活方便 | 副作用函数可能在每次渲染时都会触发,需要额外的依赖管理 | 副作用操作、数据订阅 | useEffect(() => { // 副作用操作 }, [dependency]); |
| useLayoutEffect | 在DOM更新之后同步执行副作用操作,获取最新的DOM信息 | 阻塞组件渲染,潜在的性能影响 | 需要获取最新DOM信息的副作用操作 | useLayoutEffect(() => { // 副作用操作 }, [dependency]); |
| useRef | 存储和访问组件中的任意值 | 需要手动处理ref的变更 | 获取DOM节点、存储任意值 | const ref = useRef(initialValue); |
| useMemo | 缓存计算值,减少不必要的计算和渲染 | 需要额外的依赖管理,仅在计算开销较大或依赖不经常变化时才适用 | 计算开销较大、依赖不经常变化的计算值 | const memoizedValue = useMemo(() => { // 计算值 }, [dependency]); |
| useCallback | 缓存回调函数,减少不必要的函数重新创建 | 需要额外的依赖管理,仅在回调函数依赖不经常变化时才适用 | 传递给子组件的回调函数、依赖不经常变化的回调函数 | const memoizedCallback = useCallback(() => { // 回调函数 }, [dependency]); |
| useImperativeHandle | 允许自定义对外暴露的实例值 | 需要配合forwardRef使用,与组件实现耦合度较高 | 控制组件实例的外部接口 | useImperativeHandle(ref, () => { // 对外暴露的实例值 }, [dependency]); |
| useTransition | 在动画切换时平滑过渡,提供更好的用户体验 | 仅在需要动画切换时使用,与动画库集成复杂 | 动画切换 | const [startTransition, isPending] = useTransition(); |
| useDeferredValue | 延迟处理更新,优化性能 | 需要额外的逻辑处理 | 优化处理大量数据更新的性能 | const deferredValue = useDeferredValue(value, { timeoutMs: 1000 }); |
| useMutableSource | 用于自定义数据源的数据订阅和更新 | 需要自定义数据源的实现 | 自定义数据源的数据管理 | const data = useMutableSource(source, getSnapshot, subscribe); |
| useSyncExternalStore | 与外部数据存储同步更新,实现双向绑定 | 需要与外部数据存储进行集成 | 与外部数据存储同步更新的场景 | useSyncExternalStore(store, subscribe, getSnapshot, setSnapshot); |
| useId | 自动生成唯一标识符,方便元素和组件的标识和操作 | 无 | 需要唯一标识符的场景 | const uniqueId = useId(); |
| useSuspense | 支持异步更新和懒加载,优化渲染体验 | 仅在需要异步更新和懒加载时使用 | 异步更新和懒加载 | const resource = useSuspense(fetchResource); |
| useCacheRefresh | 刷新缓存数据,手动触发数据更新 | 需要手动管理缓存数据和触发刷新操作 | 缓存数据的刷新 | const refreshCache = useCacheRefresh(); |
| useOptimistic | 实现乐观更新策略,提升用户体验 | 需要额外的状态管理和处理 | 乐观更新策略 | const [data, updateData] = useOptimistic(initialData); |
| useFormStatus | 管理表单的状态和验证规则 | 只适用于特定场景,不适用于所有表单 | 需要管理表单状态和验证规则的情况 | const {padding} = useFormStatus(); |