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

首次渲染调用状态更新函数引发Maximum update depth exceeded错误

解决React中调用setState引发的Maximum update depth exceeded错误

我通过setInterval每3秒向数组添加一个随机数,原本代码运行正常,但尝试在首次渲染时调用extendTheList函数(即取消注释代码中的extendTheList();),就会触发Maximum update depth exceeded错误。

相关代码如下:

const [listItems, setListItems] = useState([]);

useEffect(() => {
    function extendTheList() {
      const randNr = Math.floor(Math.random() * 10);
      setListItems([...listItems, randNr]);
    }

    // extendTheList();

    const int = setInterval(() => {
      extendTheList();
    }, 3000);
    return () => clearInterval(int);
  }, [listItems]);

错误原因

useEffect的依赖数组包含listItems,当调用extendTheList时,setListItems会更新listItems状态,这会触发useEffect重新执行。而每次useEffect执行时又会调用extendTheList,再次更新listItems,形成无限循环,最终导致React触发更新深度超限的错误。

解决方案

方案一:使用函数式更新+空依赖数组(推荐)

通过函数式更新setState,不需要依赖listItems本身,同时将useEffect的依赖数组设为空,确保只在组件首次渲染时执行一次,避免循环:

const [listItems, setListItems] = useState([]);

useEffect(() => {
    function extendTheList() {
      const randNr = Math.floor(Math.random() * 10);
      // 函数式更新,直接基于前一次状态生成新数组
      setListItems(prevItems => [...prevItems, randNr]);
    }

    // 首次渲染添加第一个随机数
    extendTheList();

    const int = setInterval(() => {
      extendTheList();
    }, 3000);
    return () => clearInterval(int);
  }, []); // 空依赖数组,仅组件挂载时执行

方案二:用useRef标记首次渲染

如果需要保留listItems作为依赖(非必要场景),可以通过useRef记录是否为首次渲染,避免每次状态更新都调用extendTheList:

const [listItems, setListItems] = useState([]);
const isFirstRender = useRef(true);

useEffect(() => {
    function extendTheList() {
      const randNr = Math.floor(Math.random() * 10);
      setListItems([...listItems, randNr]);
    }

    // 仅首次渲染时调用
    if (isFirstRender.current) {
      extendTheList();
      isFirstRender.current = false;
    }

    const int = setInterval(() => {
      extendTheList();
    }, 3000);
    return () => clearInterval(int);
  }, [listItems]);

内容的提问来源于stack exchange,提问作者studio-pj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:25:35