网站首页 > 文章精选 正文
React Hooks 核心总结
React Hooks 是 React 16.8 引入的函数式组件增强特性,用于状态管理、副作用处理、逻辑复用等,使代码更简洁且易于维护。
一、常用 Hooks
- useState
o 作用:函数组件中管理状态。
o 语法:const [state, setState] = useState(initialValue)
o 注意:状态更新是浅比较,复杂对象需返回新对象以触发渲染。 - useEffect
o 作用:处理副作用(如数据请求、DOM 操作、订阅)。
o 语法:useEffect(() => { ... }, [deps])
o 无依赖:组件每次渲染后执行。
o 空依赖 []:仅在挂载和卸载时执行。
o 有依赖 [dep]:依赖变化时执行。
o 清理函数:返回函数用于取消订阅等清理操作(如 clearInterval)。 - useContext
o 作用:跨组件层级共享状态,避免逐层传递 props。
o 语法:const value = useContext(MyContext)
o 搭配:需先用 React.createContext 创建上下文。 - useReducer
o 作用:复杂状态逻辑管理(类似 Redux)。
o 语法:const [state, dispatch] = useReducer(reducer, initialArg)
o 适用场景:状态逻辑涉及多子值或依赖前状态。 - useMemo & useCallback
o useMemo:缓存计算结果,避免重复计算。
o 语法:const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b])
o useCallback:缓存函数,避免子组件不必要的渲染。
o 语法:const memoizedFn = useCallback(() => { doSomething(a, b) }, [a, b])
o 注意:依赖项数组需正确设置,否则可能引发闭包问题。 - useRef
o 作用: - 访问 DOM 元素:const ref = useRef(null); <div ref={ref} />
- 保存可变值(类似类组件的实例变量),变更不会触发渲染。 o 语法:const refContainer = useRef(initialValue)
- useLayoutEffect
o 作用:与 useEffect 类似,但执行时机在 DOM 更新后、浏览器绘制前。
o 适用场景:需同步读取 DOM 布局(如调整元素尺寸)。
二、其他 Hooks
- useImperativeHandle
o 作用:自定义通过 ref 暴露给父组件的实例值。
o 语法:useImperativeHandle(ref, () => ({ focus: () => {} }))
o 搭配:需与 forwardRef 一起使用。 - useDebugValue
o 作用:在 React 开发者工具中显示自定义 Hook 的标签。
o 语法:useDebugValue(value, formatFn)
三、自定义 Hooks
o 定义:将组件逻辑提取为可复用的函数,命名以 use 开头(如 useFetch)。
o 示例:封装数据请求逻辑。
function useFetch(url) {
const [data, setData] = useState(null);
useEffect(() => {
fetch(url).then(res => res.json()).then(setData);
}, [url]);
return data;
}
四、Hooks 使用规则
- 顶层调用:只能在函数组件或自定义 Hook 的顶层调用,不可在条件、循环中调用。
- 命名规范:自定义 Hook 必须用 useXxx 格式命名。
- 依赖项:useEffect、useMemo、useCallback 需正确声明依赖项,避免遗漏或冗余。
- ESLint 插件:使用 eslint-plugin-react-hooks 自动检查规则。
五、最佳实践
o 逻辑拆分:将复杂组件拆分为多个 Hooks,提升可读性(如 useUserData、useWindowResize)。
o 避免滥用:useMemo/useCallback 仅在性能瓶颈时使用,过度使用可能增加内存开销。
o 闭包陷阱:在异步操作中访问最新状态时,使用 useRef 保存可变值或通过 setState 函数式更新。
六、对比类组件优势
o 简化代码:无需 this,避免生命周期方法分散逻辑(如 componentDidMount、componentDidUpdate)。
o 逻辑复用:自定义 Hook 替代 HOC 或 Render Props,减少嵌套。
o 函数式友好:更贴合现代 JavaScript 的函数式编程风格。
通过合理使用 Hooks,可以构建更清晰、可维护性更高的 React 应用。
猜你喜欢
- 2025-07-01 你还在用“笑cry”表情包吗?00后表示很嫌弃……
- 2025-07-01 初中7~9年级所有动词短语汇总(附习题及解析)
- 2025-07-01 产品设计思考:广告位埋点,这个需求有何意义?
- 2025-07-01 想在职场混得风生水起?这6个技能很重要
- 2025-07-01 聊聊 React 日常研发最常用的 15个 Hooks
- 2025-07-01 我找到了 Compiler 在低版本中使用的方法,它不再是 React 19 的专属
- 2025-07-01 React re-render的性能操作文档(react render做了什么)
- 2025-07-01 与 Vue 相伴四年,终究还是没抵住 React 的巨大诱惑
- 2025-07-01 [抓狂] 组件卡顿拖后腿?4 个 React 性能优化大招 [颠覆认知]
- 2025-07-01 程序员用了这11招,开发效率暴增10倍!第8个绝了
- 08-02分布式事务:SpringCloud 项目中的一致性密码解锁
- 08-02raft 协议简介
- 08-02超融合介绍-SmartX
- 08-02分布式事务:如何保证多个系统间的数据一致性
- 08-02分布式事务详解、理论分析、及强一致性(2PC、3PC)剖析
- 08-02分布式事务
- 08-02什么是分布式文件存储系统 ?
- 08-02Paxos 协议
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)
- fmt.println (52)