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等工具进行静态分析,以便事先弄清楚这些。
添加回答
举报