You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS中next dev运行正常但build失败,误将普通函数识别为React Hooks

问题原因

这个报错是ESLint的react-hooks/rules-of-hooks校验规则触发导致的。Next.js构建阶段默认会开启ESLint全量校验,而dev模式下校验规则宽松很多,所以才会出现dev正常运行、build失败的差异。

核心触发逻辑是:React的Hook规则校验默认会把所有名称以use开头的函数识别为自定义React Hook,和函数实际逻辑无关。你定义的异步函数名字为useFunction,刚好命中了这个命名识别规则,ESLint就将它按照Hook的规则校验,自然就会报「Hook不能在回调函数里调用」的错误。

解决方案
  • 方案1(推荐):修改普通函数的命名,不要以use开头,比如改成handleFunctionCall、fetchResult之类符合普通函数命名习惯的名称即可,修改后代码示例:
// 调整函数命名,避免触发Hook识别规则
const fetchResult = async () => {
  const result = await someStuff();
  return result
}

const FunctionButton = () => {
  return <Button onClick={() => fetchResult()}>Click Me</Button>;
};

export default FunctionButton;
  • 方案2(不推荐):如果确实不想修改函数名,可以临时给对应行加ESLint忽略注释,但是会破坏Hook规则的正常校验逻辑,不建议常规使用,示例:
const FunctionButton = () => {
  // eslint-disable-next-line react-hooks/rules-of-hooks
  return <Button onClick={() => useFunction()}>Click Me</Button>;
};
额外建议

作为React新手建议遵守社区通用命名规范:所有自定义Hook统一用use开头命名,普通业务函数、事件处理函数不要用use开头,既可以避免这类校验报错,也能提升代码可读性。

内容的提问来源于stack exchange,提问作者donpicante

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:09:02