首页 > 解决方案 > React-Router中的PrivateRoute,HOC在经过身份验证后仍然重定向到登录?

问题描述

我正在尝试利用从 redux 商店到 HOC 的状态来允许或拒绝我的 *app 中的用户,例如私有路由。

我正在关注 React-Router 的文档,并且它成功了一半。我的问题是当我转到 URL 或刷新新验证的路由时,如果 通过验证,我会被重定向。单击导航栏的作品,请参阅下面的 gif。

*我也在使用 Next.JS,但无法让路由系统与 Semantic-UI-React 一起使用。这就是我使用 React-Router 的原因。

在此处输入图像描述

这是我的完整组件:

import React, { Component } from 'react'
import { connect } from 'react-redux'
import { logInUser, logOutUser } from '../store/index'
import { bindActionCreators } from 'redux'

import {
 BrowserRouter as Router,
 Switch,
 Route,
 Redirect,

 withRouter
} from 'react-router-dom'

import LinkNavWithLayout from './LinkNavWithLayout'
import Index from './home'
import Profile from './profile'
import Dashboard from './dashboard'
import Login from './login'
import Register from './register'

class App extends Component {
 static getInitialProps({ store, isLoggedIn, logInUser, logOutUser }) {
  return { store, isLoggedIn, logInUser, logOutUser }
 }

 constructor(props) {
  super(props)

  this.state = {
   isLoggedIn: false
  }

 }

 render(){
  const { isLoggedIn } = this.props;

 console.log("pages/index this.props ", this.props);
  let navBars = [
   { name: "Home", path: "/"},
   { name: "Profile", path: "/profile"},
   { name: "Dashboard", path: "/dashboard"},
   { name: "Log in", path: "/login"},
   { name: "Register", path: "/register"}
  ];

我的 HOC PrivateRoute 组件:

  function PrivateRoute({ children, ...rest }) {
   return (
    <Route
     {...rest}
     render={({ location }) =>
      isLoggedIn ? (
       children
      ) : (
        <Redirect
         to={{
          pathname: "/login",
          state: { from: location }
         }}
        />
       )
     }
    />
   );
  }

  return (
    <>
    <Switch>
     <Route
      path='/'
      exact
      render={(props) => <LinkNavWithLayout {...props} data={navBars}><Index /></LinkNavWithLayout>} />

我正在使用它/profile/dashboard路线

     <PrivateRoute
      path='/profile'
      isLoggedIn={isLoggedIn}
      >
      <LinkNavWithLayout data={navBars}><Profile /></LinkNavWithLayout>
     </PrivateRoute>

     <PrivateRoute
      path='/dashboard'
      isLoggedIn={isLoggedIn}
     >
      <LinkNavWithLayout data={navBars}><Dashboard /></LinkNavWithLayout>
     </PrivateRoute>

     <Route
      path='/login'
      render={(props) => <Login {...props}/>}
     />

     <Route
      path='/register'
      render={() => <Register />}
     />

     <Route component={({ location }) => <p>Sorry but the page <h1>{location.pathname.substring(1)} </h1> Page, Could Not be found</p>} />
    </Switch>
    </>
  )
 }
}

function mapStateToProps(state) {
 const { isLoggedIn } = state
 return { isLoggedIn }
}

const mapDispatchToProps = dispatch =>
 bindActionCreators({ logInUser, logOutUser }, dispatch)

export default withRouter(connect(mapStateToProps, mapDispatchToProps)(App))

提前致谢!我已经被困了一段时间,所以任何帮助将不胜感激!

标签: reactjsauthenticationreduxnext.jsreact-router-dom

解决方案


您的问题是您的 redux 状态或与此相关的任何状态。由于它是单页应用程序,因此不会在重新加载时持续存在。不是没有本地存储。

当我们从本地存储中获取信息以进入状态时。这叫水合作用。所以如果你用谷歌搜索持久化/水合 redux。你应该找到你需要的工具和文章。

这是我发现看起来不错的一个。 https://medium.com/@jrcreencia/persisting-redux-state-to-local-storage-f81eb0b90e7e


推荐阅读