useEffect 处于无限循环中。如何解决这个问题?

useEffect goes in an infinite loop. How to fix this?

提问人:FiFi 提问时间:4/2/2022 最后编辑:FiFi 更新时间:4/2/2022 访问量:123

问:

请更改此代码,以便 useEffect 不会一次又一次地调用自身。在这里,我从后端获取数据并更新 useEffect 中的状态,useEffect 本身就是依赖项。有没有一些简单的方法可以解决它?

我的用例: 我使用表单添加帖子,提交表单后,我希望它立即显示更新的帖子列表。“帖子”是一个组件,其中更新的帖子列表作为道具传递,每个单独的帖子都在组件“帖子”中呈现。因此,我想在提交表单后将更新的帖子列表传递给“帖子”

useEffect(() => {
    async function readPosts(){
      try {
        const res = await axios.post(backendLink + '/post/profile/read');
        setPosts(res.data.posts);
      } catch (err) {
        console.log(err);
      }
    }
    readPosts();
  }, [posts])
JavaScript reactjs mern

评论

0赞 FZs 4/2/2022
从依赖项中删除。现在每次变化都会重新运行,效果也会改变,因此无限循环。如果需要重新运行它,请添加任何其他依赖项。postsuseEffectpostsposts

答:

1赞 Khant 4/2/2022 #1
useEffect(() => {
    async function readPosts(){
      try {
        const res = await axios.post(backendLink + '/post/profile/read');
        setPosts(res.data.posts);
      } catch (err) {
        console.log(err);
      }
    }
    readPosts();
  }, []) // Change here

评论

0赞 FiFi 4/2/2022
不过,我不想只在第一次渲染中调用它
0赞 Andy 4/2/2022
那你想什么时候叫它呢?您的用例是什么?@FiFi
1赞 Khant 4/2/2022
然后不要使用 useEffect 并创建一个函数,该函数在按下按钮时调用 readPost。
0赞 FiFi 4/2/2022
我使用表单添加帖子,提交表单后,我希望它立即显示更新的帖子列表。“帖子”是一个组件,其中更新的帖子列表作为道具传递,每个单独的帖子都在组件“帖子”中呈现。因此,我想在提交表单后将更新的帖子列表传递给“帖子”
1赞 FiFi 4/2/2022
@Andy 从你的最新回复中得到了我需要的东西。非常感谢Khant和Andy。
0赞 huzzzus 4/2/2022 #2

这就是您的代码中现在发生的情况。

useEffect 在“posts”值更改时触发。 useEffect 更改了“帖子” 触发 useEffect,因为 useEffect 更改了“帖子”

这是一个无限循环。从依赖项中删除 [帖子] 并找到解决方法。