我试图设置变量“工作区”的状态,但是当我控制台记录数据时,出现了无限循环。我在useEffect()内部调用axios“ get”函数,并在此循环之外调用控制台日志,因此我不知道是什么触发了所有重新渲染。在this question中找不到我的特定问题的答案。这是我的代码:
srcRect
是否有人看到导致重新渲染的原因?谢谢!
答案 0 :(得分:2)
效果钩子在每个渲染周期运行,并且没有依赖项数组的效果钩子将在每个渲染周期执行其回调。如果效果回调更新了状态,即proposals
,则将另一个渲染循环加入队列,从而创建渲染循环。
如果要在组件安装时只运行一次效果,请使用空的依赖项数组。
useEffect(() => {
getItems();
}, []);
如果您希望它仅在特定时间运行,例如match参数更新,则在数组中包含一个依赖项。
useEffect(() => {
getItems();
}, [match]);
答案 1 :(得分:1)
您对useEffect的使用不正确。如果您的依赖项数组为空,则每次状态数据发生任何更改时都会调用它。因此,您的useEffect
被调用导致setProposals
,然后再次导致useEffect
运行,依此类推>
尝试
useEffect(() => {
getItems();
} , []); // an empty array means it will be called once only
答案 2 :(得分:0)
我认为是以下内容:useEffect
应该有第二个参数[]
,以确保它仅执行一次。即:
useEffect(() => {
getItems();
}, []);
否则,setProposal
将修改触发重新渲染的状态,该状态将调用useEffect
,这将进行异步调用,从而setProposal
,... >