【发布时间】:2021-08-08 23:39:33
【问题描述】:
当用户登录时,我正在初始化一个使用私有路由连接到 Firebase 的 TS React 应用程序。
在我刷新页面之前,一切似乎都运行良好。当我这样做时,应用程序会将我带回到作为登录页面的公共路径。
我认为问题可能是设置为 null 的上下文的初始状态,但可能是另一个问题。
这是我的用户上下文的代码:
import React, { useContext, useState, useEffect } from "react";
import firebase from "firebase/app";
import { auth } from "../firebase";
export const AuthContext = React.createContext<firebase.User | null>(null);
export function useAuth() {
return useContext(AuthContext);
}
export const AuthProvider: React.FC = ({ children }) => {
const [user, setUser] = useState<firebase.User | null>(null);
useEffect(() => {
const unsubscribe = auth.onAuthStateChanged((firebaseUser) => {
setUser(firebaseUser);
});
return unsubscribe;
}, []);
return <AuthContext.Provider value={user}>{children}</AuthContext.Provider>;
};
这是我创建私有路由的方式:
import React, { useContext } from "react";
import { Redirect, Route, RouteProps } from "react-router";
import { AuthContext } from "../contexts/AuthContext";
interface IPrivateRoute extends RouteProps {
component: any;
}
const PrivateRoute = ({ component: Component, ...rest }: IPrivateRoute) => {
const user = useContext(AuthContext);
setTimeout(() => console.log(user), 1000);
return (
<div>
<Route
{...rest}
render={(props) => {
return user ? <Component {...props} /> : <Redirect to="/login" />;
}}>
</Route>
</div>
);
};
export default PrivateRoute;
我将不胜感激所有有用的答案!
【问题讨论】:
-
你一针见血。您的问题确实源于使用
null作为您的初始值。您要么需要实现“正在加载用户”变量作为状态的一部分,要么考虑使用User | null | undefined类型,其中undefined用作“等待我检查”临时值。
标签: javascript reactjs typescript firebase routes