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

React调用setState出现Too many re-renders无限重渲染问题求助

问题原因
  • 你将setSearchedProducts状态更新逻辑直接写在了组件顶层渲染流程中,只要input不为空,每次组件渲染都会触发状态更新,而状态更新又会触发组件重新渲染,最终形成无限循环,触发React的重渲染次数限制报错。
  • 原有逻辑还存在input清空后无法重置产品列表的缺陷。
解决方法

方案1:使用useEffect包裹状态更新逻辑

把过滤和状态更新逻辑放到useEffect中,仅在input或products发生变化时才执行,避免循环触发渲染:

import { useState, useEffect } from 'react';

// 组件内部代码
const [input, setInput] = useState("");
const [searchedProducts, setSearchedProducts] = useState(products);

const inputChange = (e) => {
  setInput(e.target.value);
};

useEffect(() => {
  if (!input) {
    // 输入为空时重置为完整产品列表
    setSearchedProducts(products);
    return;
  }
  const newProducts = products?.filter(el => 
    el.Name.toLowerCase().includes(input.toLowerCase())
  ) || [];
  setSearchedProducts(newProducts);
}, [input, products]); // 仅依赖input和products变化执行

方案2:使用useMemo计算派生值(更推荐)

过滤后的产品列表完全由products和input两个值决定,属于派生状态,不需要单独维护state,直接用useMemo缓存计算结果即可,代码更简洁:

import { useState, useMemo } from 'react';

// 组件内部代码
const [input, setInput] = useState("");
const inputChange = (e) => {
  setInput(e.target.value);
};

// 直接计算过滤后的产品列表
const searchedProducts = useMemo(() => {
  if (!input) return products;
  return products?.filter(el => 
    el.Name.toLowerCase().includes(input.toLowerCase())
  ) || [];
}, [input, products]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:54:03