【问题标题】:React Hooks infinite loop Memory leak?React Hooks无限循环内存泄漏?
【发布时间】:2021-03-05 06:30:09
【问题描述】:

您好,我遇到了无限循环的问题。我看到的所有示例都使循环消失了。但是如果我不刷新它就不会更新我的视图。我希望在添加某些内容时显示这些项目。我以为我的例子会起作用,但它没有。我不知道如何解决它

      const [ReadBookingTimes, SetBookingTimes] = useState([]);
      const [readStatus, setStatus] = useState("");
        
        const getBookingTimes = async () => {
            try {
              const response = await Axios.get(`${API_ENDPOINT}`);
              console.log(response);
              // debugger;
              SetBookingTimes(response.data);
              // setStatus("Connection sucsessfull");
            } catch (err) {
              setStatus("Error getting BookingTimes");
            }
          };
        
          //reupdate State and prevent infinite loop
          useEffect(() => {
            getBookingTimes(ReadBookingTimes);
          }, [ReadBookingTimes]); //);

【问题讨论】:

    标签: reactjs axios react-hooks infinite-loop use-effect


    【解决方案1】:

    您的 useEffect 具有每次更新的依赖关系 ReadBookingTimes。基本上,您每次都会一遍又一遍地更新ReadBookingTimes。

    你应该做的是添加一个条件来检查你的数据是否已经加载,如果是,不要调用该函数:

    const [ReadBookingTimes, SetBookingTimes] = useState([]);
    const [readStatus, setStatus] = useState("");
    
    const [dataLoaded, setDataLoaded] = useState(false);
    
    
     const getBookingTimes = async () => {
         // Your fetch code
         setDataLoaded(true)
     }
    
     useEffect(() => {
         // don't go any further of data is already loaded.
         if (dataLoaded) return;
    
         getBookingTimes(ReadBookingTimes);
     }, [ReadBookingTimes, dataLoaded]);
    

    现在您不会陷入循环。并且任何时候你想重新加载数据,你可以将dataLoaded更改为false,useEffect会再次调用getBookingTimes函数。

    例如,如果您希望每 2 分钟获取一次数据,您可以添加超时以更改 dataLoaded 状态,每次导致另一次数据重新加载。

    【讨论】:

    • 我的数据加载应该在响应数据之后吗?
    • 我试过了,添加项目时它没有更新我的视图。但它不再循环,或者它现在不会触发,因为我正在使用 Postman 加载数据?还是应该重新渲染?
    • 是的,加载您的回复后。添加项目是什么意思?您没有添加任何新项目。
    • 现在我正在使用邮递员将数据添加到列表中。但我将创建一个函数来将 stuf 添加到列表中。我希望它自动渲染,这样我就可以在不刷新页面的情况下看到项目。
    • 您可以在添加新项目时将dataLoaded 设置回false,然后您的usEffect 函数将被触发,然后再次加载数据导致重新渲染。
    猜你喜欢
    • 2020-07-15
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2019-10-17
    • 2016-01-13
    相关资源
    最近更新 更多