刷新页面时,Firebase onAuthStateChange 返回的第一个结果为未定义。因此,我无法检查用户是否经过身份验证。
我的 useAuth Hook :
export default function useAuth() {
const [authUser, setAuthUser] = useState();
const user = useFirebase();
useEffect(() => {
onAuthStateChanged(user.auth, (user) => {
user ? setAuthUser(user) : setAuthUser(false);
});
}, [user]);
return authUser;
}
当我尝试刷新页面时,用户的第一个结果未定义,结束后我得到结果。
function App() {
const authUser = useAuth();
console.log("au", authUser);
return (
<div className="App">
<Routes>
<Route exact path="/" element={<HomePage />} />
<Route path="/blogs" element={<BlogsPage />} />
<Route path="/blog/:id" element={<SingleBlogPage />} />
<Route path="/contact" element={<ContactPage />} />
<Route path="/login" element={<AdminLogin />} />
<Route
path="/admin"
element={authUser ? <Dashboard /> : <Navigate to="/vanja-login" />}
>
<Route exact path="dashboard" element={<Settings />} />
</Route>
</Routes>
<Footer />
</div>
);
}
最佳答案
初始渲染的初始 authUser
状态未定义,因此这是预期的行为。 onAuthStateChanged
监听器在初始渲染周期结束时通过 useEffect
实例化。如果您的 UI 的任何部分依赖于这种“不确定的”authUser
状态,它应该相应地处理它。
此外,当组件卸载或 user
对象从 Firebase 更新/更改时,您还应该取消订阅任何身份验证状态监听器。
示例:
export default function useAuth() {
const [authUser, setAuthUser] = useState();
const user = useFirebase();
useEffect(() => {
const unsubscribe = onAuthStateChanged(
user.auth,
(user) => setAuthUser(user ?? false)
);
return unsubscribe;
}, [user]);
return authUser;
}
...
const AuthLayout = () => {
const authUser = useAuth();
console.log("au", authUser);
if (authUser === undefined) {
return null; // or loading spinner, etc...
}
return authUser ? <Outlet /> : <Navigate to="/vanja-login" />;
};
...
function App() {
return (
<div className="App">
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/blogs" element={<BlogsPage />} />
<Route path="/blog/:id" element={<SingleBlogPage />} />
<Route path="/contact" element={<ContactPage />} />
<Route path="/login" element={<AdminLogin />} />
<Route path="/admin" element={<AuthLayout />}>
<Route index element={<Dashboard />} />
<Route path="dashboard" element={<Settings />} />
</Route>
</Routes>
<Footer />
</div>
);
}
关于reactjs - 页面刷新时 Firebase onAuthStateChange 返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71526028/