前端面试题

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)


相关推荐
Rabbit_QL1 小时前
【前端UI行话】前端 UI 术语速查表
前端·ui·状态模式
码码哈哈0.01 小时前
LangChain 快速入门(从0到可用)
开发语言·python·langchain
小码哥_常2 小时前
一文带你吃透Android BLE蓝牙开发全流程
前端
熊文豪2 小时前
Java 入门指南
开发语言·python
小码哥_常2 小时前
从“新老交锋”看Retrofit与Ktor
前端
小菜鸡桃蛋狗2 小时前
C++——类和对象(上)
开发语言·c++
伯恩bourne2 小时前
Google Guava:Java 核心工具库的卓越之选
java·开发语言·guava
小J听不清2 小时前
CSS 外边距(margin)全解析:取值规则 + 实战用法
前端·javascript·css·html·css3
2401_879503412 小时前
C++中的观察者模式变体
开发语言·c++·算法