【发布时间】:2019-10-29 00:28:14
【问题描述】:
我正在尝试在我的顶级组件 App 上设置 Firebase 身份验证侦听器,以便通过 React 上下文向所有其他组件提供 authUser 对象。
我目前正在这样做:
function App() {
console.log('Rendering App...');
const [authUser,setAuthUser] = useState(null);
const [authWasListened,setAuthWasListened] = useState(false);
useEffect(()=>{
console.log('Running App useEffect...');
return firebase.auth().onAuthStateChanged(
(authUser) => {
console.log(authUser);
console.log(authUser.uid);
if(authUser) {
setAuthUser(authUser);
setAuthWasListened(true);
} else {
setAuthUser(null);
setAuthWasListened(true);
}
}
);
},[]);
return(
authWasListened ?
<Layout/>
: <div>Waiting for auth...</div>
);
}
但是我得到了日志输出:
Rendering App...
Running App useEffect...
似乎我正在设置侦听器,但它一开始并没有运行,因此它没有获得当前的身份验证状态(它为空,因为我什至还没有登录表单)。它似乎在等待变化发生。
authListener不应该先获取当前authUser的状态,然后再监听变化吗?我做错了什么?
更新
我发现我做错了什么。 useEffect 应该返回一个函数来清除unmount 上的侦听器,而不是函数调用,就像我在上面尝试做的那样。所以我的听众从来没有被设置过。
现在按预期工作:
useEffect(()=>{
console.log('Running App useEffect...');
const authListener = firebase.auth().onAuthStateChanged(
(authUser) => {
console.log(authUser);
console.log(authUser.uid);
if(authUser) {
setAuthUser(authUser);
setAuthWasListened(true);
} else {
setAuthUser(null);
setAuthWasListened(true);
}
}
);
return authListener; // THIS MUST BE A FUNCTION, AND NOT A FUNCTION CALL
},[]);
【问题讨论】:
标签: javascript reactjs firebase firebase-authentication