使用Hooks的两条重要规则
面试速答
- 以下内容以 React 18 为准。
- Hooks 有两条经典规则:
- 只在最顶层调用,不要在循环、条件、嵌套函数中调用
- 只在 React 函数组件或自定义 Hook 中调用
- 这两条规则的本质都是为了保证 React 能稳定定位每个 Hook 的状态槽位。
第一条:只在最顶层调用
错误写法:
if (visible) {
const [count, setCount] = useState(0)
}
为什么不行?
因为 visible 一旦变化,Hook 调用顺序就会变化,React 后面拿状态会错位。
正确做法通常是:
const [count, setCount] = useState(0)
if (!visible) {
return null
}
也就是“条件写在 Hook 后面”,而不是“让 Hook 出现在条件里”。
第二条:只在 React 函数里调用
合法位置:
- 函数组件
- 自定义 Hook
不合法位置:
- 普通工具函数
- 类组件方法
- 事件回调内部临时新建 Hook
因为 Hook 依赖的是 React 渲染过程中的调用上下文,脱离这个上下文就没有意义。
标准答法
问:为什么 Hooks 有这两条规则?
答:因为 React 需要依赖固定调用顺序和固定调用上下文来把每次 Hook 调用映射到正确的内部状态节点。如果顺序和上下文不稳定,状态就会错乱。
易错点
- 只会背规则,不知道底层原因。
- 认为“偶尔在条件里用一次也没关系”。
- 在普通函数里调用 Hook,希望复用逻辑。
速记要点
- 规则 1:顶层调用,顺序固定。
- 规则 2:只在 React 组件或自定义 Hook 中调用。
- 根因:React 依赖调用顺序定位状态。