useState正在使用history.push重置

时间:2019-06-24 18:42:03

标签: javascript reactjs react-router

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

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

2 个答案:

答案 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>