为了账号安全,请及时绑定邮箱和手机立即绑定

使用 history.push 重置 useState

使用 history.push 重置 useState

神不在的星期二 2021-07-06 13:57:28
在我的表格中,我执行以下操作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>我正在寻找一种解决方案来在登录所有页面后保持 isAuthenticated 状态,即使在单击另一个链接或调用 history.push 之后
查看完整描述

2 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

究其原因isAuthenticated返回true时,你的个人资料页上的第一个土地,但恢复到false时浏览到另一个页面只能是该AuthProvider组件,当你点击一个链接和状态得到重新初始化被意外重新渲染。

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


查看完整回答
反对 回复 2021-07-15
?
HUWWW

TA贡献1874条经验 获得超12个赞

您的状态正在重置,因为它在层次结构中位于 Router 之下。


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


查看完整回答
反对 回复 2021-07-15
  • 2 回答
  • 0 关注
  • 466 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信