React Hooks 无限循环内存泄漏?
React Hooks infinite loop Memory leak?
你好,我遇到了无限循环的问题。我看过的所有例子都让循环消失了。但是如果我不刷新它就不会更新我的视图。我希望这些项目在添加内容时出现。我认为我的例子会奏效,但事实并非如此。我不知道如何修复它
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]); //);
您的 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
状态,从而导致另一次数据重新加载。
你好,我遇到了无限循环的问题。我看过的所有例子都让循环消失了。但是如果我不刷新它就不会更新我的视图。我希望这些项目在添加内容时出现。我认为我的例子会奏效,但事实并非如此。我不知道如何修复它
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]); //);
您的 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
状态,从而导致另一次数据重新加载。