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

React Hooks:如何在组件渲染前设置数据并解决无限循环问题

解决React Hooks的Maximum Update Depth Exceeded错误

嘿,这个坑我刚学React Hooks的时候也踩过!咱们先理清楚问题出在哪,再给你两种靠谱的解决方案。

错误原因分析

你现在的useEffect没有设置依赖数组,这就导致每次组件渲染(包括调用setRooms之后的重新渲染)都会执行这个effect。而setRooms又会修改rooms状态,触发组件再次重新渲染——这么一来就陷入了无限循环,React自然就抛出Maximum update depth exceeded的错误了。

方案一:直接在useState中初始化(推荐)

因为你的Products是静态的mock数据,不会在组件生命周期里变化,最简洁高效的方式就是直接把处理好的数据作为useState的初始值。这样组件第一次渲染前就会把状态设置好,完全不需要useEffect:

import { useState } from 'react';
import Products from './你的Products文件路径'; // 记得替换成实际路径

function App() {
  // 直接把映射后的mock数据作为rooms的初始状态
  const [rooms, setRooms] = useState(
    Products.data.map(room => ({ id: room.id, title: room.title }))
  );
  const [days, setDays] = useState([]);

  return (
    {/* 你的组件内容 */}
  )
}

方案二:给useEffect加上空依赖数组

如果之后你打算把这段逻辑换成真实的API请求,想提前保留useEffect的结构,那一定要给它加上空的依赖数组[]。这个数组告诉React:这个effect只需要在组件挂载(第一次渲染完成)时执行一次,不需要监听任何状态或props的变化:

import { useState, useEffect } from 'react';
import Products from './你的Products文件路径';

function App() {
  const [rooms, setRooms] = useState([]);
  const [days, setDays] = useState([]);

  useEffect(() => {
    const roomsMapped = Products.data.map(room => ({ id: room.id, title: room.title }));
    setRooms(roomsMapped);
  }, []); // 空依赖数组是关键!只执行一次

  return (
    {/* 你的组件内容 */}
  )
}

这样修改后,就不会再出现无限循环的问题,mock数据也会在组件初始化时被正确设置到状态里啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:37:00