3 回答

TA貢獻1804條經驗 獲得超3個贊
onAuthUserListener返回一個取消訂閱的函數。這應該在組件卸載時使用。
在您的代碼中,您沒有返回取消訂閱功能。
const listener = () => {
firebase.onAuthUserListener(..) // problem here no return
}
所以在useEffect你應該正確分配它并在useEffect返回時使用它。
const [user, setUser] = React.useState(null);
useEffect(
() => {
// v------ proper assignment.
const listener = firebase.onAuthUserListener(
(authUser: any) => {
localStorage.setItem('authUser', JSON.stringify(authUser));
setUser(authUser);
},
() => {
localStorage.removeItem('authUser');
setUser(null);
}
);
return () => listener();
}
, [] // no deps
);

TA貢獻1785條經驗 獲得超4個贊
這里可能是錯誤:
useEffect(() => {
listener();
return () => {
listener(); <--- here
};
});
問題是,為了觸發listener();呼叫,需要改變什么狀態?
我認為這:
const listener = () => {
firebase.onAuthUserListener(
(authUser: any) => {
localStorage.setItem('authUser', JSON.stringify(authUser));
setState(authUser);
},
() => {
localStorage.removeItem('authUser');
setState(null);
}
);
};
應該轉化為一個 React Hook。干杯!

TA貢獻1883條經驗 獲得超3個贊
useEffect需要一個依賴數組作為第二個參數,否則它會在每次渲染時繼續運行。由于您正在更新狀態,因此只會不斷重復
useEffect(() => {
listener();
return () => {
listener();
};
}, []);
您可以使用Runaway Effects或 ESLint等工具進行靜態分析,以便事先弄清楚這些。
添加回答
舉報