Rules of Hooks Hooks 使用规则

最后更新:2026-10-28

Rules of Hooks Hooks 使用规则

Hooks 只有两条铁律:只在函数组件或自定义 Hook 的最顶层调用,不要放进循环、条件或嵌套函数;只在 React 函数中调用,不要在普通 JS 函数里调用。React 靠「调用顺序」对应每个 Hook 的状态,顺序一乱状态就串位。

分组路由与状态管理
类型模式

ℹ️ 说明 编辑器将 JSX 转译为 JavaScript 后在沙箱中渲染真实界面;组件自动挂载,无需手写 render 调用。

📝 语法

// ✅ 顶层无条件调用
function Counter() {
  const [n, setN] = useState(0)
  useEffect(() => { /* ... */ }, [])
  // ❌ 不能这样:if (n > 0) useEffect(...)
  // ❌ 不能这样:for 循环里 useState(0)
  return <button onClick={() => setN(n + 1)}>{n}</button>
}

返回值:无返回值,作为编码模式使用

▶ 示例

示例可直接运行:展开后自动渲染,编辑代码即时生效。

输出结果:

面板显示两条 ✓ 规则与一条 ✗ 反例;点按钮更新计数与勾选,无论怎么交互 Hooks 都按固定顺序执行,状态不串位。

💡 要点

⚠️ 注意 违反规则不会立刻报错,而是出现「点 A 按钮改了 B 的值」这类诡异 bug;eslint-plugin-react-hooks 能在编译前拦住。
💡 提示 提前 return 必须放在所有 Hook 调用之后,否则某次渲染会跳过 Hook、打乱调用顺序。
ℹ️ 说明 React Compiler 能在编译期自动优化组件,但两条规则依然是它成立的前提。
更多案例整理中,敬请期待。

📚 相关教程

❓ 常见问题

Q 为什么不能在条件语句里调用 Hook?
A React 用「调用顺序」把每次渲染的 Hook 与状态一一对应;条件调用会让顺序漂移,第 n 个 Hook 读到别人的状态。
Q 自定义 Hook 里能调用其他 Hook 吗?
A 可以,这正是自定义 Hook 的意义——名字以 use 开头的函数内部同样遵循顶层调用规则。
Q 组件里能先 return 再调用 Hook 吗?
A 不能。要么把 Hook 提到 return 之前,要么把 return 之后的 JSX 拆成子组件,保证每次渲染 Hook 全部执行。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏