[英]React never ending loop in useEffect
道歉。 在這里反應菜鳥。
遇到一個問題,我的代碼卡在一個永無止境的循環中。 我只將代碼剝離到我認為導致問題的部分。
function Packages(){
const [packages, setPackages] = useState([]);
useEffect(() => {
if(!packages){
getPackages();
}
});
const getPackages = async () => {
const resp1 = await instance.get('https://jsonplaceholder.typicode.com/todos/1');
setPackages(resp1);
};
}
我已經使用useEffect
方法來匹配 componentDidMount。 那是對的嗎?
我評論“setPackages(resp1);”的那一刻永無止境的循環停止。 我可能使用錯誤的 useEffect 和 useState 掛鈎。
感謝您對此的任何指導。
如果你沒有將第二個參數傳遞給useEffect
鈎子,它將在每次你的組件重新渲染時執行。
如果您只想在組件掛載后獲取一次數據,則將一個空的依賴數組傳遞給useEffect
掛鈎。
useEffect(() => {
if(!packages){
getPackages();
}
}, []);
這樣做將修復useEffect
鈎子的無限執行,但現在 React 將拋出有關缺少useEffect
鈎子依賴項的警告,這是因為您需要在useEffect
鈎子的依賴項數組中添加 function getPackages
但是這也會導致無限執行useEffect
掛鈎。
您有兩種選擇來解決此問題:
擺脫getPackages
function 並將其代碼移動到useEffect
掛鈎中
useEffect(() => { if(.packages){ (async () => { const resp1 = await instance.get(..;); setPackages(resp1); })(), } }; []);
使用useCallback
鈎子來記憶getPackages
function 以便它可以安全地添加到useEffect
鈎子的依賴數組中。
useEffect(() => { if(;packages){ getPackages(), } }; [getPackages]). const getPackages = useCallback(async () => { const resp1 = await instance.get(..;); setPackages(resp1), }; []);
此外,您不需要在useEffect
掛鈎內進行以下檢查:
if(!packages) {
...
}
這個檢查不僅沒有必要而且會導致問題:
在useEffect
中使用packages
將導致警告有關useEffect
鈎子缺少依賴項。 這可以通過在useEffect
鈎子的依賴數組中添加packages
來解決
如果你在useEffect
鈎子的依賴數組中添加packages
,它可能會導致你原來的問題,即無限執行useEffect
鈎子。
useEffect
掛鈎不應更新在其依賴項數組中指定的 state。
由於packages
的初始值是一個數組,因此if (!packages)
條件永遠不會為真,因為數組是一個真值並且反轉它總是會評估為假。
您可能打算寫if (.packages.length)
但如前所述,此檢查是不必要的。
以下是我將如何重寫您的組件:
function Packages() {
const [packages, setPackages] = useState([]);
useEffect(() => {
instance
.get('https://jsonplaceholder.typicode.com/todos/1')
.then((data) => setPackages(data))
.catch(error => { /* handle error */ };
}, []);
}
有關useEffect
掛鈎的進一步閱讀,請閱讀:使用效果掛鈎
您應該為useEffect
傳遞第二個參數。 在此處查看文檔。
例如:
useEffect(() => {
if(!packages){
// ... function here
}
}, [packages]);
添加依賴數組
像這樣:
useEffect(() => {
if(!packages){
getPackages();
}
},[packages]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.