在我的表单中,我执行以下操作
import useReactRouter from 'use-react-router';
const { history } = useReactRouter();
onSubmit={async (values, { setSubmitting }) => {
setSubmitting(true);
fetch('/register', {
method: 'POST',
body: JSON.stringify(values),
headers: {
'Content-Type': 'application/json'
}
})
.then(res => res.json())
.then(async response => {
setSubmitting(false);
if (!response.success) return showAlert();
await login();
history.push('/profile');
})
登录执行此操作:
export const AuthContext = createContext<any>(null);
const AuthProvider = ({ children }: ProviderProps): JSX.Element => {
const [auth, setAuth] = useState({
isAuthenticated: false,
user: null
});
const login = () => {
fetch('/me')
.then(res => res.json())
.then(response => {
if (response) setAuth({ isAuthenticated: true, user: response });
});
};
const logout = () => {
fetch('/logout').then(() =>
setAuth({ isAuthenticated: false, user: null })
);
};
return (
<AuthContext.Provider
value={{
state: {
auth
},
actions: {
login,
logout
}
}}
>
{children}
</AuthContext.Provider>
);
};
注册后,`isAuthenticated在下面的代码中返回true,但是导航到另一个页面后,它再次返回false,这可能是什么问题?
const PrivateRoute = (props: PrivateRouteProps) => {
const { component: Component, ...rest } = props;
const {
state: {
auth: { isAuthenticated }
}
} = useContext(AuthContext);
console.log(isAuthenticated);
<Router>
<div>
<AuthProvider>
<Header />
<Route exact path="/" component={Home} />
<MuiPickersUtilsProvider utils={LocalizedUtils} locale={nlLocale}>
<Route exact path="/register" component={Register} />
</MuiPickersUtilsProvider>
<PrivateRoute exact path="/profile" component={Profile} />
</AuthProvider>
</div>
</Router>
我正在寻找一种解决方案,即使在单击另一个链接或调用history.push之后,也可以通过所有页面登录后保持isAuthenticated状态。
答案 0 :(得分:1)
当您第一次进入“个人资料”页面时,isAuthenticated
返回true
的原因,但是导航到另一个页面时却返回到false
的原因可能仅仅是因为AuthProvider
组件单击链接时意外重新渲染,并且状态被重新初始化。
您是否使用<Link>
组件进行链接?如果不是,则导航到另一个页面时,整个应用将被重新渲染,并且状态不会持久。
答案 1 :(得分:0)
您的状态正在重置,因为它在层次结构中的路由器下方。
<AuthProvider>
<Router>
<div>
<Header />
<Route exact path="/" component={Home} />
<MuiPickersUtilsProvider utils={LocalizedUtils} locale={nlLocale}>
<Route exact path="/register" component={Register} />
</MuiPickersUtilsProvider>
<PrivateRoute exact path="/profile" component={Profile} />
</div>
</Router>
</AuthProvider>