React 不会在状态更新后重新渲染组件

React does not re-render component after state update

我正在编写一个 React 页面,显示由外部 API 获取的测验列表。同时,我的页面有一个“新测验”按钮,它会打开一个对话框,其中包含一个表单,供用户配置和创建新测验。

这里是问题所在:我不确定如何在 POST 请求完成后让我的 table 重新呈现。在研究了 useEffect() 的第二个参数之后,我最终面临两种情况:

  1. Table 在 POST 之后重新渲染,但 useEffect 进入无限循环
  2. useEffect 不会进入无限循环,但table不会重新渲染

这是我的代码:

   const handleSubmit = () => {
    setLoading(true);

    const body = {
      name: newQuizName,
      collectionId: newQuizCollection,
      length: newQuizLength,
      estimator: newQuizEstimator,
      survey: newQuizSurvey
    }

    axios.post(quizzes_api, body).then(res => console.log(res));
    fetchQuizzes();
    resetDialog();

    setLoading(false);
   }

   const quizzes_api = `http://localhost:5000/quizzes`;
   const pools_api = `http://localhost:5000/pools`;

   const fetchQuizzes = () => {
     axios.get(quizzes_api).then(res => setQuizzes(res.data));
   }

   const fetchPools = () => {
     axios.get(pools_api).then(res => setPools(res.data))
   }

   useEffect(() => {
     fetchQuizzes();
     fetchPools();
   }, [])

由于这里使用的第二个参数是[],所以是不重新渲染的版本。我试过放置 [quizzes],它解决了前端的问题;但是我的 Flask 服务器被 GET 请求淹没了。

我还会注意到这与此线程中的问题非常相似:

但是,我无法通过那里提供的解决方案解决问题。

任何见解将不胜感激。

  const handleSubmit = () => {
    setLoading(true);

    const body = {
      name: newQuizName,
      collectionId: newQuizCollection,
      length: newQuizLength,
      estimator: newQuizEstimator,
      survey: newQuizSurvey
    }

    axios.post(quizzes_api, body).then(res => console.log(res));
    fetchQuizzes();
    resetDialog();

    setLoading(false);
   }

此处您在 post 请求完成之前获取,因此您没有获得更新的结果。仅在 post 完成后使用 async await 和 运行 fetchQuizzes

此外,useEffect 运行s 每当依赖项数组中发生任何更改时...因此,如果您从 useEffect 内部更改某些依赖项,则会导致无限循环