前端面试题

1.React Hooks 为什么不能写在 if 里面?底层原理是什么?

🧠 一句话核心

👉 Hooks 依赖调用顺序来记录状态,所以不能写在条件判断中


📦 展开说(面试标准版)

React 在执行函数组件时:

👉 会维护一个 hooks 链表(或数组)

每次调用 useState / useEffect:

👉 按顺序依次记录


❗关键点:

👉 React 不是通过变量名识别 Hooks

👉 而是通过:

👉 "第几个调用" 来对应状态


🚨 如果写在 if 里会发生什么?

if (flag) {

useEffect(() => {})

}

当 flag 变化时:

  • 第一次:执行了 useEffect

  • 第二次:没执行

👉 就会导致:

👉 hooks 顺序错乱


❗结果:

  • 状态错位

  • 数据混乱

  • 甚至报错


🎯 总结一句话

👉 Hooks 必须在组件顶层调用,保证每次执行顺序一致

📦 举个最关键的例子(一步一步看)

function Demo({ flag }) {

const a, setA = useState(1)

if (flag) {

useEffect(() => {

console.log('effect')

})

}

const b, setB = useState(2)

return null

}


🧨 第一次渲染(flag = true)

执行顺序:

1️⃣ useState(a) → 👉 位置1

2️⃣ useEffect → 👉 位置2

3️⃣ useState(b) → 👉 位置3

👉 React 内部记录:

a, effect, b


🧨 第二次渲染(flag = false)

执行顺序变了:

1️⃣ useState(a) → 👉 位置1

❌ useEffect 不执行

2️⃣ useState(b) → 👉 位置2(⚠️问题来了)

👉 React 以为:

a, ???, ???

但实际上你现在是:

a, b


🚨 关键错误发生了

👉 React 还以为:

  • 第2个 Hook 是 useEffect

  • 但你现在第2个 Hook 变成 useState(b)

👉 于是:

💥 b 的状态被错认成 effect


🎯 结果就是

  • 状态错位

  • 数据混乱

  • 报错(Hooks mismatch)


相关推荐
时间海8711 小时前
对象键清洗之前,先拦住重名
javascript·后端
青春逝如流水1 小时前
Java 线程与操作系统、硬件的关系:状态、映射与差异
java·开发语言·多线程·ai文章
Amos_Web1 小时前
Rspack 源码解析(二十):Typed Hook 系统如何靠宏生成
前端·rust·前端框架
谢亮_vipxieliang1 小时前
Go gRPC基础与实战
开发语言·后端·golang
程序员大阳1 小时前
副队长CSS教程(29)–CSS Grid 实战:实现通用图文混排布局
前端·css·grid·图文混排
对空六课1 小时前
无头浏览器访问对跳出率的过滤规则
服务器·前端·算法·数据分析
小番茄夫斯基2 小时前
Nginx 介绍
前端
Aurorar0rua2 小时前
CS50 x 2024 Notes Data structures - 08
c语言·开发语言·学习方法
企业数字化笔记2 小时前
新租户注册成功却不能用?开通状态、初始化恢复与可用性验收
开发语言·python