常见 Hooks 有哪些?分别适合什么场景?
一、最基础必备 Hooks#
1. useState#
- 作用:定义组件状态变量,修改状态触发视图更新
- 场景:所有需要组件内状态管理的地方
- 开关、计数器、表单输入、显示隐藏等
const [count, setCount] = useState(0)jsx2. useEffect#
- 作用:处理副作用(异步、DOM 操作、定时器、请求)
- 场景:
- 发送网络请求
- 订阅/取消订阅
- 操作真实 DOM
- 定时器/延时器
useEffect(()=>{
// 请求、定时器
}, [])jsx3. useContext#
- 作用:跨组件共享数据,告别 props 层层传递
- 场景:
- 全局主题、语言
- 用户信息
- 多层组件需要共享的数据
const value = useContext(MyContext)jsx二、性能优化 Hooks#
4. useMemo#
- 作用:缓存计算结果
- 场景:
- 耗时计算(过滤、排序大量数据)
- 缓存对象/数组,防止子组件重渲染
const total = useMemo(()=>count*1000, [count])jsx5. useCallback#
- 作用:缓存函数本身
- 场景:
- 函数传递给子组件时
- 配合 React.memo 防止子组件重复渲染
const handleClick = useCallback(()=>{}, [])jsx6. React.memo#
- 作用:缓存整个组件
- 场景:
- 子组件频繁被父组件触发重渲染
- 纯展示组件,props 不变就不更新
const Child = React.memo(Child)jsx三、DOM & 引用 Hooks#
7. useRef#
- 作用:
- 获取真实 DOM 元素
- 存储不需要渲染的变量(定时器 ID、上次值)
- 场景:
- 获取 input、div 等 DOM
- 存定时器、计数器,修改不触发渲染
const inputRef = useRef(null)
const timerRef = useRef(null)jsx8. useLayoutEffect#
- 作用:DOM 更新后、浏览器绘制前同步执行
- 场景:
- 需要获取 DOM 最新尺寸/位置
- 避免页面闪烁、布局抖动
useLayoutEffect(()=>{
// 读取 DOM 布局
}, [])jsx四、状态管理增强 Hooks#
9. useReducer#
- 作用:复杂状态逻辑替代 useState
- 场景:
- 状态多、逻辑复杂
- 一个动作修改多个状态
- 状态依赖之前的值
const [state, dispatch] = useReducer(reducer, initialState)jsx10. useImperativeHandle#
- 作用:子组件向父组件暴露方法
- 场景:
- 父组件调用子组件函数
- 自定义表单组件、弹窗组件
useImperativeHandle(ref, () => ({
open, close
}))jsx超清晰总结表#
| Hooks | 核心功能 | 最常用场景 |
|---|---|---|
| useState | 状态管理 | 开关、输入、计数 |
| useEffect | 副作用处理 | 请求、定时器、DOM 操作 |
| useContext | 跨组件共享 | 全局主题、用户信息 |
| useMemo | 缓存计算值 | 耗时计算、缓存对象/数组 |
| useCallback | 缓存函数 | 函数传给子组件 |
| useRef | 存储引用/DOM | 获取 DOM、存不渲染变量 |
| useReducer | 复杂状态 | 多状态、复杂逻辑 |
| useLayoutEffect | 同步布局 | 读取 DOM 尺寸、防闪烁 |
一句话记忆口诀#
状态修改用useState,
副作用用useEffect,
跨组件传值useContext,
缓存数值useMemo,
缓存函数useCallback,
获取 DOM 用useRef。