Reactjs React can';我不明白为什么我得到了太多的重新渲染错误

Reactjs React can';我不明白为什么我得到了太多的重新渲染错误,reactjs,Reactjs,这个问题已经被问了很多次,但每个案例都是独一无二的。因此,我无法在代码中找到导致错误的原因。它看起来与return语句中的三元数有关,但我不明白出了什么问题 const Results = () => { const [favorites, setFavorites] = useState({}); const [loading, setLoading] = useState(true); const [summoner, setSummoner] = useState(&qu

这个问题已经被问了很多次,但每个案例都是独一无二的。因此,我无法在代码中找到导致错误的原因。它看起来与return语句中的三元数有关,但我不明白出了什么问题

const Results = () => {
  const [favorites, setFavorites] = useState({});
  const [loading, setLoading] = useState(true);
  const [summoner, setSummoner] = useState("");
  const location = useLocation();
  try {
    setSummoner(location.state.params);
  } catch (err) {
    console.log(err);
  }

  useEffect(() => {
    (async () => {
      await fetch(
        "...",
        {
          method: "POST",
          body: summoner,
        }
      )
        .then((res) => res.json())
        .then((favs) => setFavorites(favs));
      setLoading(false);
    })();
  }, []);

  return summoner.length > 0 ? (
    <div>
      <Navbar />
      <Loader>
        <LoaderPosition>
          <DotLoader color={"white"} size={250} loading={loading} />
        </LoaderPosition>
      </Loader>
      <Favorites>
        <Title>Favorite Champions of {summoner}</Title>
        {Object.entries(favorites).map((entry) => (
          <Card key={entry[1].name} data={entry[1]} />
        ))}
      </Favorites>
    </div>
  ) : (
    <Search />
  );
};

export default Results;
const Results=()=>{
const[favorites,setFavorites]=useState({});
const[loading,setLoading]=useState(true);
const[召集人,集合汇总人]=使用状态(“”);
const location=useLocation();
试一试{
setSummoner(location.state.params);
}捕捉(错误){
控制台日志(err);
}
useffect(()=>{
(异步()=>{
待命(
"...",
{
方法:“张贴”,
身体:召唤者,
}
)
.然后((res)=>res.json())
然后((favs)=>setFavorites(favs));
设置加载(假);
})();
}, []);
返回召唤器。长度>0(
最受欢迎的{召唤者}冠军
{Object.entries(收藏夹).map((条目)=>(
))}
) : (
);
};
导出默认结果;
基本上,我想做的是通过更改地址栏的URL来防止转到
/results
。因为如果搜索页面未发送所需参数,则会抛出错误。

这是您的问题:

try {
    setSummoner(location.state.params);
  } catch (err) {
    console.log(err);
  }

如果没有捕捉到错误,则会反复设置Summoner。每个集合都会重新呈现组件,因此最终会出现一个无休止的循环。

在组件范围内,您不能执行
setSummoner
,必须在useffect或某个函数调用中调用它。否则,每次更新组件时,它都会被调用,并且会进入无限循环。