【发布时间】:2021-06-24 02:25:13
【问题描述】:
我正在尝试使用 Firebase 身份验证来实现受保护的页面。我创建了一个典型的 PrivateRoute 组件,该组件应该只在用户登录时显示该页面,或者如果用户未登录则将用户重定向到登录页面。
我使用 App.js 中的 useEffect 挂钩将身份验证状态存储在全局状态中。经过大量阅读和研究,我了解到 useEffect 仅在 Child 组件加载后完成。
话虽如此,我不知道如何将身份验证从 App 传递到 PrivateRoute。使用我当前的代码,仅在 PrivateRoute 将用户推送到登录页面后,身份验证状态才会注册为 true。将不胜感激。
App.js
//context
const [{user, authenticated}, dispatch] = useStateValue();
useEffect(() => {
auth.onAuthStateChanged((authUser) => {
console.log("THE USER IS >>> ", authUser);
if (authUser) {
dispatch({
type: "SET_USER",
user: authUser,
});
dispatch({
type: "SET_AUTH",
authenticated: true,
})
} else {
// the user is logged out
dispatch({
type: "SET_USER",
user: null,
});
dispatch({
type: "SET_AUTH",
authenticated: false,
})
}
});
}, []);
return (
<Router>
<div className="app">
<PrivateRoute exact isAuth={authenticated} path="/account/create-store" component={CreateAccount} />
</div>
</Router>
)
PrivateRoute.js
import { Route, Redirect } from 'react-router';
import { useStateValue } from './StateProvider';
function PrivateRoute ({ isAuth: isAuth, component: Component, ...rest }) {
const [{authenticated}, dispatch] = useStateValue();
return (
<Route {...rest} render={(props) => {
if (isAuth) {
return <Component />
} else {
return (
<Redirect to={{ pathname:"/login", state: {from: props.location }}} />
);
}
}} />
)
}
export default PrivateRoute
reducer.js
export const initialState = {
user: null,
authenticated: false,
};
const reducer = (state, action) => {
console.log(action)
switch(action.type) {
case "SET_USER":
return {
...state,
user: action.user,
}
case "SET_AUTH":
return {
...state,
authenticated: action.authenticated,
}
default:
return state;
}}
export default reducer;
【问题讨论】:
-
这不是一个真正的答案,但我发现了这篇文章 (stackoverflow.com/questions/58769189/…),实际上它可以让事情正常进行。不过,我仍然非常感谢您解释为什么我的方法存在缺陷。
标签: javascript reactjs react-router react-hooks react-context