news 2026/5/12 13:32:31

react的hooks优缺点、底层实现及hooks参数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
react的hooks优缺点、底层实现及hooks参数

一、Hooks 是什么(从设计动机说)

一句话:

Hooks = 用函数 + 闭包 + 链表,模拟 Class 的生命周期和实例状态

React 团队当初想解决 3 个核心痛点:

1️⃣ Class 太复杂(this、绑定、生命周期分散)
2️⃣ 逻辑复用靠 HOC / render props 太重
3️⃣ 状态逻辑和 UI 强耦合、难拆

Hooks 的目标是:

状态逻辑可组合、可复用、可预测


二、Hooks 的优点(不说废话版)

✅ 1. 逻辑复用能力极强

function useFetch() {} function useDebounce() {}

👉逻辑复用 ≠ 组件嵌套


✅ 2. 代码结构更贴近“业务”

对比:

// Class:生命周期割裂 componentDidMount() {} componentDidUpdate() {}
// Hooks:逻辑聚合 useEffect(() => { // 订阅 + 更新 }, []);

✅ 3. 更利于函数式编程 / 并发渲染

  • 无实例

  • 无 this

  • 可中断、可重放(Concurrent Mode)


三、Hooks 的缺点(真实痛点)

❌ 1. 心智负担高(闭包陷阱)

useEffect(() => { console.log(count); }, []);

👉新手 100% 会踩


❌ 2. 依赖数组极易写错

  • 少了 → 用旧值

  • 多了 → 无限触发


❌ 3. 不利于 OOP 场景

  • 复杂对象状态

  • 多态、继承


四、Hooks 的底层实现原理(重点)

1️⃣ Hooks 本质是什么?

Hooks 本质是:
在 Fiber 上挂一条“Hooks 链表”


React 内部(极简伪代码)

Fiber = { memoizedState: hook1 -> hook2 -> hook3 }

每个 Hook 是一个节点:

hook = { memoizedState, queue, next }

2️⃣ 为什么 Hooks 不能写在 if 里?

if (flag) { useState(); } useEffect();

👉因为 Hooks 是靠“调用顺序”取值的

第 1 个 useState → hook1 第 2 个 useEffect → hook2

一旦顺序变了:

链表就错位了


3️⃣ Hooks 执行流程(简化)

首次渲染(mount)

render() → mountState → mountEffect → 建立 hooks 链表

更新(update)

render() → updateState → updateEffect → 复用链表节点

五、useState 底层是怎么更新的?

const [state, setState] = useState(0);

本质结构:

hook.memoizedState = 0; hook.queue = { pending: update1 -> update2 };

setState 做了什么?

setState → 创建 update → 放进 queue → 调度 Fiber 更新

六、useEffect 的底层机制(很多人答不清)

useEffect(() => { return () => cleanup; }, deps);

本质三步:

1️⃣ 比较 deps(Object.is)
2️⃣ 变化 → 标记 effect
3️⃣ commit 阶段执行副作用


effect 真正执行时机

阶段是否执行
render
commit
paint 后✅(异步 effect)

七、Hooks 参数到底代表什么(核心)

1️⃣ useState(initialState)

useState(0)
参数含义
initialState初始状态(只在 mount 用一次)

👉 支持函数:

useState(() => compute());

2️⃣ useEffect(callback, deps)

useEffect(fn, deps);

参数含义

参数作用
callback副作用函数
deps决定是否重新执行

deps 三种情况(必会)

deps行为
不传每次 render
[]只执行一次
[a, b]a / b 变才执行

3️⃣ useMemo / useCallback

本质一样,区别是“缓存什么”

useMemo(() => value, deps); // 缓存值 useCallback(() => fn, deps); // 缓存函数

👉缓存的是“引用稳定性”


4️⃣ useRef(initialValue)

const ref = useRef(0);
特点说明
不触发渲染改了也不 rerender
引用稳定render 间不变
常见用途DOM / 定时器 / 上一值

5️⃣ useLayoutEffect vs useEffect

对比useEffectuseLayoutEffect
执行时机paint 后paint 前
是否阻塞
场景请求 / 订阅测量 DOM

八、Hooks 的“正确使用心法”(工程经验)

✅ 推荐

  • 状态最小化

  • effect 拆分

  • 自定义 Hook 抽逻辑

❌ 避免

  • 一个 effect 干一堆事

  • 忽略 eslint 依赖警告

  • 滥用 useMemo


九、Hooks vs Class,面试总结句

你可以直接这么说:

Hooks 通过闭包 + 链表管理状态,
解决了 Class 中逻辑分散和复用困难的问题,
但也引入了依赖管理和闭包陷阱的心智成本

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 13:10:35

SSM疫情防疫背景下青年志愿者56iu0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面

系统程序文件列表 系统项目功能:志愿者,志愿者活动,活动报名,疫情数据,活动时长,普通管理员 SSM疫情防疫背景下青年志愿者管理系统开题报告 一、课题研究背景与意义 1.1 研究背景 疫情防疫工作中,青年志愿者作为基层防控的重要力量,承担着…

作者头像 李华
网站建设 2026/5/12 2:26:32

bert-base-chinese中文文本水印:基于特征向量扰动的版权标识嵌入方案

bert-base-chinese中文文本水印:基于特征向量扰动的版权标识嵌入方案 你有没有遇到过这样的问题:辛辛苦苦训练的中文文本处理模型,或者精心调优的业务系统,刚上线就被复制、迁移甚至商用?更麻烦的是,一旦内…

作者头像 李华
网站建设 2026/5/4 5:04:24

SiameseUIE中文信息抽取:法律文书关键实体识别案例分享

SiameseUIE中文信息抽取:法律文书关键实体识别案例分享 在处理大量法律文书时,你是否也遇到过这样的困扰:判决书、起诉状、合同文本动辄数千字,关键信息却像藏宝图一样散落在字里行间?人工逐字筛查不仅耗时费力&#…

作者头像 李华
网站建设 2026/5/6 12:43:21

QWEN-AUDIO生产环境:24/7稳定运行+显存自回收部署方案

QWEN-AUDIO生产环境:24/7稳定运行显存自回收部署方案 1. 这不是普通TTS,是能“呼吸”的语音系统 你有没有试过让AI说话时,听起来像真人一样有情绪起伏、有停顿节奏、甚至带点小犹豫?QWEN-AUDIO不是把文字转成声音的流水线&#…

作者头像 李华
网站建设 2026/5/4 5:51:11

亲测Z-Image-Turbo镜像,AI绘图效果惊艳真实体验分享

亲测Z-Image-Turbo镜像,AI绘图效果惊艳真实体验分享 最近在CSDN星图镜像广场上刷到一款叫“阿里通义Z-Image-Turbo WebUI图像快速生成模型”的镜像,标注是“二次开发构建by科哥”。名字里带“Turbo”,还强调“快速生成”,我立马来…

作者头像 李华
网站建设 2026/5/10 0:29:34

天津商业空间设计:本地团队的美学落地方案 [特殊字符]

天津商业空间设计:本地团队的美学落地方案 🎨天津作为北方商业枢纽,从老租界的洋楼商圈到滨海的新商业体,商业空间的迭代一直是品牌破局的关键。但不少品牌踩过坑:外地设计团队照搬网红模板,结果和天津消费…

作者头像 李华