我的应用程序中有一个AuthProvider
,如果用户未登录,它将自动重定向到登录页面
interface IAuthContext {
token: string | undefined;
}
export const AuthContext = createContext<IAuthContext>({ token: undefined });
export const AuthProvider = ({ children }: { children: ReactNode }) => {
const [token, setToken] = useState<string | undefined>();
const navigate = useNavigate();
useEffect(() => {
const authToken = localStorage.getItem('authToken');
if (!authToken) {
navigate('/login');
}
setToken(token);
}, []);
return <AuthContext.Provider value={{ token }}>{children}</AuthContext.Provider>;
};
MyComp
是AuthProvider
的子项。因此,应始终定义token
,因为如果它不存在,则AuthProvider
将重定向到登录页面,并且永远不会呈现MyComp
。
export const MyComp = () => {
const { token } = useContext(AuthContext);
if (!token) {
throw new Error('missing token');
}
const data = useMemo(() => fetchData(token), token);
return <div>{data}</div>;
};
每次使用token时,都要Assert它不是未定义的,这很烦人。
有没有更好的方法来输入它,这样我就不需要Assert令牌已经定义,也不需要给予createContext
一个默认值?
2条答案
按热度按时间zwghvu4y1#
zrfyljdw2#
找到了一种使用typescript函数重载和自定义react钩子的方法
然后,我可以使用
useAuthContext
钩子来获取一个定义的上下文。如果我想自己处理默认上下文值,我也可以将
true
传递给useAuthContext