Glittering's blog Glittering's blog
Home
  • 学习手册

    • 《TypeScript教程》
    • 《Git》
    • 《Vite》
    • 《Vue3》
    • 《React18》
    • 《CSS》
    • 《Tailwind CSS》
    • 《JavaScript教程》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)

Glitz Ma

前端开发工程师
Home
  • 学习手册

    • 《TypeScript教程》
    • 《Git》
    • 《Vite》
    • 《Vue3》
    • 《React18》
    • 《CSS》
    • 《Tailwind CSS》
    • 《JavaScript教程》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)
  • react基础

    • React重要阶段的特性
    • Vue3 → React18对照学习表
    • class和hooks选哪个好
    • 四个常用Hook作用和区别
    • React的hooks基础总结
    • React的hooks实战应用总结
      • 一、状态管理实战模式
        • 1️⃣ 局部状态 vs 全局状态拆分原则
        • ✅ 局部状态(优先)
        • ✅ 全局状态
        • 2️⃣ useReducer 实战场景
        • 适合:
      • 二、副作用管理最佳实践
        • 3️⃣ 请求封装:useRequest 模式
        • 推荐结构:
        • 实战点:
        • 4️⃣ 流式输出场景(AI Chat)
      • 三、性能优化实战
        • 5️⃣ useMemo / useCallback 正确使用方式
        • ❌ 常见错误
        • ✅ 正确使用场景
        • 6️⃣ 大列表优化
        • 实战组合:
      • 四、闭包问题实战解决方案
        • 7️⃣ 定时器 Hook 封装
      • 五、Context 高级用法
        • 8️⃣ 避免全量刷新
      • 六、并发特性实战
        • 9️⃣ useTransition 场景
        • 🔟 useDeferredValue 场景
      • 七、Hooks 设计规范(团队级)
        • 1️⃣1️⃣ 自定义 Hook 设计原则
        • 1️⃣2️⃣ 依赖数组规范
      • 八、企业级最佳实践总结
        • 状态设计
        • 副作用设计
        • 性能设计
      • 九、高级前端面试总结
      • 十、如果你是做 AI Chat / 大型系统
  • react原理

  • react全家桶

  • 《React18》学习笔记
  • react基础
mamingjuan
2026-03-04
目录

React的hooks实战应用总结

# 一、状态管理实战模式

# 1️⃣ 局部状态 vs 全局状态拆分原则

# ✅ 局部状态(优先)

  • 表单
  • 弹窗开关
  • hover / loading
  • 局部 UI 状态

用:

useState
useReducer
1
2

原则:

状态尽量靠近使用它的组件


# ✅ 全局状态

不要滥用 Context。

推荐:

  • 轻量场景:Context + selector
  • 中大型项目:zustand / jotai
  • 超复杂:redux-toolkit

高级优化点:

  • 切 store(按域拆分)
  • selector 精准订阅
  • 避免顶层大对象

# 2️⃣ useReducer 实战场景

# 适合:

  • 多字段联动表单
  • 状态机流程
  • 复杂业务逻辑

示例:

const [state, dispatch] = useReducer(reducer, initialState)
1

优势:

  • 状态集中
  • 可测试
  • 可追踪

面试亮点:

用 useReducer 做过轻量状态机


# 二、副作用管理最佳实践

# 3️⃣ 请求封装:useRequest 模式

不要直接在组件里写 fetch。

# 推荐结构:

function useRequest(service, options) {
  const [data, setData] = useState(null)
  const [loading, setLoading] = useState(false)
  const abortRef = useRef(null)

  const run = useCallback(async (...args) => {
    abortRef.current?.abort()
    const controller = new AbortController()
    abortRef.current = controller

    setLoading(true)
    const result = await service(...args, controller.signal)
    setData(result)
    setLoading(false)
  }, [service])

  useEffect(() => {
    return () => abortRef.current?.abort()
  }, [])

  return { data, loading, run }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 实战点:

  • 支持取消请求
  • 支持重复调用
  • 防止内存泄漏
  • 保证引用稳定

# 4️⃣ 流式输出场景(AI Chat)

你最近在准备 AI Chat 架构,这个很关键。

核心问题:

  • 流式更新会导致频繁 re-render
  • 长对话会卡顿
  • 需要可中断

优化方案:

  • useRef 存缓存
  • RAF 合并更新
  • useTransition 降低优先级
  • 消息分层 memo

# 三、性能优化实战

# 5️⃣ useMemo / useCallback 正确使用方式

# ❌ 常见错误

  • 到处包 useCallback
  • deps 填不对
  • 为优化而优化

# ✅ 正确使用场景

  • 传给 React.memo 子组件
  • 作为 useEffect 依赖
  • 大计算

# 6️⃣ 大列表优化

场景:2000 条消息

# 实战组合:

  • 虚拟列表
  • 消息组件 React.memo
  • key 稳定
  • 状态拆分(不要 messages 整体替换)

错误示例:

setMessages([...messages, newMsg])
1

优化:

  • 使用函数式更新
  • 拆成 map + id 存储

# 四、闭包问题实战解决方案

# 7️⃣ 定时器 Hook 封装

错误写法:

setInterval(() => console.log(count), 1000)
1

正确封装:

function useInterval(callback, delay) {
  const savedCallback = useRef(callback)

  useEffect(() => {
    savedCallback.current = callback
  })

  useEffect(() => {
    const id = setInterval(() => {
      savedCallback.current()
    }, delay)
    return () => clearInterval(id)
  }, [delay])
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

优点:

  • 永远拿最新 state
  • 不重新注册 interval

# 五、Context 高级用法

# 8️⃣ 避免全量刷新

问题:

Context value 改变 → 全部子组件重渲染

解决:

  • 拆分多个 context
  • useMemo 包裹 value
  • selector 模式

# 六、并发特性实战

# 9️⃣ useTransition 场景

搜索过滤:

const [isPending, startTransition] = useTransition()

const onSearch = (value) => {
  setInput(value)

  startTransition(() => {
    setFilteredList(filter(value))
  })
}
1
2
3
4
5
6
7
8
9

效果:

  • 输入不卡顿
  • 过滤低优先级

# 🔟 useDeferredValue 场景

用于:

  • 大表格
  • 数据图

与 useMemo 区别:

  • useMemo 是缓存
  • useDeferredValue 是调度延迟

# 七、Hooks 设计规范(团队级)

# 1️⃣1️⃣ 自定义 Hook 设计原则

  • 命名 useXxx
  • 单一职责
  • 不暴露内部状态结构
  • 返回对象结构稳定

推荐:

return useMemo(() => ({
  data,
  loading,
  run
}), [data, loading, run])
1
2
3
4
5

# 1️⃣2️⃣ 依赖数组规范

原则:

  • 不要忽略 ESLint 提示
  • 不要随便加 eslint-disable
  • 不要把对象写进 deps(除非 memo)

# 八、企业级最佳实践总结

# 状态设计

  • 状态最小化
  • 数据归一化
  • 拆分粒度

# 副作用设计

  • 所有副作用必须可清理
  • 必须考虑组件卸载
  • 请求必须可取消

# 性能设计

  • 默认不过度优化
  • 关键路径优化
  • 用 profiler 验证

# 九、高级前端面试总结

在 React 项目中,我通常遵循状态就近原则,用 useReducer 处理复杂逻辑,用自定义 Hook 封装副作用,并结合 useTransition 优化长列表或搜索场景。对闭包问题和并发渲染机制有深入理解,能在高频更新场景下保持 UI 流畅。


# 十、如果你是做 AI Chat / 大型系统

  • 流式渲染 Hook 设计
  • 可中断机制
  • 并发优先级控制
  • 虚拟列表
  • 状态分层
上次更新: 2026/03/04, 09:44:50
React的hooks基础总结
Vue3 effect vs react hooks

← React的hooks基础总结 Vue3 effect vs react hooks→

Copyright © 2015-2026 Glitz Ma
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式