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

NextJS中useEffect页面渲染时触发两次的问题求助

Next.js中useEffect触发两次的解决方案

问题原因

在Next.js 13+的App Router(或Pages Router开启Strict Mode时),开发环境下React的Strict Mode会刻意执行两次组件渲染和副作用函数,这是框架的设计行为,目的是提前发现重复执行副作用可能引发的问题(比如重复请求、内存泄漏等),生产环境下不会出现这个情况。

解决办法

1. 接受开发环境的两次触发(推荐)

这是Strict Mode的预期效果,生产构建后useEffect只会执行一次。如果你的副作用逻辑(比如fetchEvents)是幂等的(重复执行不会有不良影响),可以不用修改代码。

2. 优化副作用逻辑,避免重复操作

如果不想让fetchEvents重复执行,可以在函数内部增加判断,比如检查数据是否已加载:

// 假设你用状态管理数据加载状态
const [events, setEvents] = useState(null);

const fetchEvents = async () => {
  if (events) return; // 数据已存在则跳过请求
  const res = await fetch('/api/events');
  const data = await res.json();
  setEvents(data);
};

useEffect(() => {
  if (!jwt) {
    console.log('you are not login');
  } else {
    console.log(cookie.GREEN_COOKIE);
  }

  fetchEvents();
}, []);

3. 关闭Strict Mode(不推荐)

如果必须在开发环境消除两次触发,可以修改next.config.js:

/** @type {import('next').NextConfig} */
const nextConfig = {
  reactStrictMode: false, // 关闭Strict Mode
};

module.exports = nextConfig;

注意:关闭后会失去Strict Mode的错误检测能力,可能错过潜在的代码问题,不建议长期使用。

你的代码示例

useEffect(() => {
  if (!jwt) {
    console.log('you are not login');
  } else {
    console.log(cookie.GREEN_COOKIE);
  }

  fetchEvents();
}, []);

控制台截图

useEffect触发两次的控制台截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:10:30