当前位置: 首页 > news >正文

React Hooks的理解?常用的有哪些?

一、React Hooks 的理解

简单来说:

Hooks = 在函数组件中“钩入(Hook)”React状态和生命周期的函数。

它解决了几个问题:

1 让函数组件也能有状态

以前函数组件只能展示 UI,没有状态。

function Counter() { const [count, setCount] = useState(0) return ( <button onClick={() => setCount(count + 1)}> {count} </button> ) }

2 替代复杂的生命周期

类组件生命周期:

componentDidMount componentDidUpdate componentWillUnmount

Hooks 用useEffect统一管理。


3 逻辑复用更简单

以前复用逻辑需要:

  • HOC(高阶组件)

  • Render Props

Hooks 可以直接抽成函数:

function useUser() { const [user, setUser] = useState(null) }

二、常用 React Hooks

开发中最常用的大概7 个


1 useState(最常用)

用于管理组件状态

import { useState } from "react" function Demo() { const [count, setCount] = useState(0) return ( <div> <p>{count}</p> <button onClick={() => setCount(count + 1)}>+1</button> </div> ) }

特点:

  • useState(初始值)

  • 返回[state, setState]

  • setState 会触发组件重新渲染


2 useEffect(生命周期)

用于处理副作用

  • 请求接口

  • 操作 DOM

  • 订阅事件

  • 定时器

import { useEffect } from "react" useEffect(() => { console.log("组件加载") return () => { console.log("组件卸载") } }, [])

依赖数组控制执行:

写法含义
useEffect(fn)每次渲染执行
useEffect(fn, [])只执行一次
useEffect(fn, [a])a变化执行

3 useRef

用于:

1️⃣ 获取 DOM
2️⃣ 保存变量(不触发渲染)

const inputRef = useRef(null) <input ref={inputRef} /> inputRef.current.focus()

4 useContext

用于跨组件传值(避免 props 逐层传递)。

const ThemeContext = createContext() function App() { return ( <ThemeContext.Provider value="dark"> <Child /> </ThemeContext.Provider> ) } function Child() { const theme = useContext(ThemeContext) }

5 useMemo(性能优化)

缓存计算结果

防止重复计算。

const result = useMemo(() => { return expensiveFunction(a, b) }, [a, b])

只有a b变化才重新计算。


6 useCallback

缓存函数

防止子组件重复渲染。

const handleClick = useCallback(() => { console.log("click") }, [])

常配合React.memo使用。


7 useReducer

用于复杂状态管理(类似 Redux)。

const [state, dispatch] = useReducer(reducer, initialState) dispatch({ type: "add" })

适合:

  • 多状态

  • 状态依赖复杂


三、Hooks 使用规则(面试必问)

React Hooks必须遵守两个规则

1 只能在函数组件或自定义 Hook 中使用

❌ 错误

if (a) { useState() }

2 必须在组件顶层调用

不能在:

  • if

  • for

  • function

里面调用。


四、自定义 Hook(高级)

可以封装逻辑。

例如封装请求:

function useFetch(url) { const [data, setData] = useState(null) useEffect(() => { fetch(url).then(res => res.json()).then(setData) }, [url]) return data }

使用:

const data = useFetch("/api/user")

五、React Hooks 优势总结

优势说明
代码更简洁不需要 class
逻辑复用自定义 Hook
生命周期更清晰useEffect
减少嵌套不需要 HOC

http://www.jsqmd.com/news/485385/

相关文章:

  • 新手入门:小数锁相环与整数锁相环教程
  • 探索昆仑通泰暖通空调控制组态程序
  • 【含文档+PPT+源码】基于SpringBoot+Vue的在线手机商城的设计与实现
  • 基于西门子S7-200的自动门控制系统设计
  • 2026年税务季薪酬系统钓鱼攻击的演化机制与防御策略研究
  • 探索信捷XD3 PLC驱动六轴机器人:梯形图与C语言的交织之旅
  • Java入门到精通容器类详解:从架构到实践
  • 驯服Transformer:百万级别文本分类新方法
  • 卷板材生产线与造纸设备的速度同步频率同步程序(S7-200 SMART篇)
  • 计算机毕业设计springboot考公信息网的设计与实现 基于SpringBoot的公务员考试资讯服务平台的设计与实现
  • 别再只会复制粘贴了!SpringBoot Maven插件深度剖析:从“能跑”到“精通”的进阶之路
  • 在 macOS 上配置 OpenClaw 连接本地 Ollama 完整指南
  • 计算机毕业设计springboot考察检测系统 基于SpringBoot的在线考试与成绩分析平台 基于SpringBoot的智能化教学测评管理系统
  • [MySQL] Package ‘libtirpc‘, required by ‘virtual:world‘, not found
  • 大模型为什么总“忘记”中间信息?Lost in the Middle的注意力陷阱
  • IAnnotation ​IDisplayDimension IDimension这三个类的职责 c# solidworks
  • 【LeetCode | 第六篇】算法笔记
  • COMSOL 数值模拟助力 N₂ 和 CO₂ 混合气体增强瓦斯抽采
  • 每日一题Day6(递归专栏---FBI数)
  • 情绪记录分析程序,记录每日情绪与触发事件,找出影响最大因素,给出调节建议。
  • 探索最优广义回归神经网络数据预测模型:DBO优化算法加持
  • OpenClaw 虚拟机保姆级部署指南
  • 大模型Agent技术全面升级
  • OpenClaw配置
  • 从CPU低延迟、GPU高带宽到大规模GPU集群
  • 用北方苍鹰优化算法优化随机配置网络SCN参数
  • 扣子(Coze)零基础入门全攻略|扣子(Coze)核心功能详解,含长期记忆、快捷指令、音视频处理及私有化部署指南
  • 揭秘CAIE认证:证书含金量、对就业的实际帮助及项目实战模块
  • 金融平台如何扩展KindEditor的PPT动态内容自动填充?
  • WangEditor在Vue2中如何处理Word文档中的特殊格式粘贴?