在我的表格中,我执行以下操作

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状态。

最佳答案

当您第一次进入“个人资料”页面时,isAuthenticated返回true的原因,但导航到另一个页面时又返回到false的原因仅是当您单击一个链接时,AuthProvider组件被意外地重新渲染了,并且状态被重新初始化。

您是否使用<Link>组件进行链接?如果不是,则导航到另一个页面时,整个应用将被重新渲染,并且状态不会持久。

09-26 07:42