【问题标题】:React context api lose auth data when react router dom push page反应路由器dom推送页面时反应上下文api丢失身份验证数据
【发布时间】:2022-01-14 13:05:56
【问题描述】:

我有一个保存用户数据的上下文,当验证上下文用户为空时,我有另一个组件,如果上下文用户为空,我的组件应将用户重定向到登录页面,否则应呈现组件.我的路由器在我的 Authprovider 中,但在重新加载路由器时仍然会丢失用户数据。我发现另一篇有同样问题的帖子,说明是将路由器保留在 useauthprovider 中,但不适用于我的应用程序。

我的代码

function App() {
  let header = window.location.pathname === '/login' || '/cadastro' ? <Header /> : null;
  let footer = window.location.pathname === '/login' || '/cadastro' ? <Footer /> : null;
  return (
    <UseAuthProvider> // My use AuthProvider
      <Router>
        <div className='app-container' >
          <Switch>
            <Cart>
              <Header />
              <NavbarMenu />
              <div className='app-body'>
                <UseCampanhaProvider>
                  <PublicRoute exact path='/' component={Home} />
                  <PrivateRoute exact path='/cupom/:campaignId' component={CupomScreen} />
                  <PrivateRoute exact path='/carrinho' component={CartScreen} />
                </UseCampanhaProvider>
                <PublicRoute exact path='/login' restricted={true} component={Login} />
                <PublicRoute path='/cadastro' restricted={true} component={Cadastro} />
              </div>
              <AuthModal />
              {footer}
            </Cart>
          </Switch>
        </div>
      </Router >
    </UseAuthProvider>
  );
}
export default App;

我验证用户上下文的组件

const PrivateRoute = ({ component: Component, ...rest }) => {
    const { user } = useAuth();
    return (
        <Route {...rest} render={props => (
            !user ?
                <Redirect to='/login' />
                :
                <Component {...props} />
        )} />
    );
};

export default PrivateRoute;

我加载用户的上下文

const UseAuthProvider = ({ children }) => {
    const [user, setUser] = useState();
    const [open, setOpen] = useState(false)
    useEffect(() => {
        verifyUser(); //here i call the function when verify the localstorage
    }, [])
    const verifyUser = async () => {
        let tokenHeader = authHeader(); 
        if (tokenHeader) {
            await Api.post('/cliente/index', {}, {
                headers: {
                    ...tokenHeader
                }
            }).then((response) => {
                setUser(response.data.cliente)
            })
        }
    }
    const handleModal = () => {
        setOpen((state) => !state)
    }
    
    const Logout = async () => {
        localStorage.clear('acessToken-bolao')
        setUser(null)
    }
    return (
        <useAuthContext.Provider value={{ Auth, verifyUser, user, Register, Logout, open, handleModal }}>
            {children}
        </useAuthContext.Provider>
    )
}

我尝试调试我的应用程序,当我将用户重定向到另一个路由器时,在组件渲染之前我的用户返回未定义,并且在我的组件渲染之后上下文加载用户数据。

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    听起来您的整个应用程序正在卸载和重新安装。 在这种情况下,状态将丢失,因为它不仅仅是重新渲染。

    您通过什么机制导航到新页面? 如果我没记错 React-Router 你需要使用 如果您尝试使用 window.location 或 href 导航 url 本身,那么您正在重新加载整个页面(不使用 SPA 中的路由器)

    如果路由正确,我预计只会重新加载 Switch 内的数据。

    【讨论】:

    • 我使用 react router dom 的 history.push
    • 您要导航到哪里?我认为在 '/cupom/:campaignId' 上有精确可能会导致您出现问题,但我看不到完整堆栈重新安装的明显原因。您可以通过将验证安装效果更改为 useEffect(() => { verifyUser(); return () => console.log("unmounted"); }, []) 来证明这种情况正在发生
    猜你喜欢
    • 2018-12-19
    • 2018-03-14
    • 1970-01-01
    • 2021-05-01
    • 2018-05-16
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2017-09-26
    相关资源
    最近更新 更多