当前位置: 首页 > 面试题库 >

使用react-router-v4在路由上执行身份验证

云何平
2023-03-14
问题内容

我正在尝试Authentication为我的支票写支票DashBoard。但是该函数本身并未被调用。有人可以给我一些解决方案吗?我正在用ReactJs开发。

这是路线部分:

 <Router>
            <div>
              <Route exact path={"/"} component={Home} />
              <Route path={"/SignUp"} component={SignUp} />
              <Route path={"/SignIn"} component={SignIn} />
              <Route path={"/Dashboard"} component={Dashboard} onEnter={this.requireAuth} />
            </div>
          </Router>

这是功能:

  requireAuth (nextState, replace) {
    console.log("?????????????",this.state.getToken);
    if(!this.state.getToken) {
      replace({pathname: '/'});
    }
  }

问题答案:

react-router v4,你可以利用render propRoute与生命周期方法一起更换onEnter功能存在于反应路由器V3。

查看此答案以获取更多详细信息:

react-router v4中的onEnter
prop

但是,由于您要做的只是在onEnter道具中进行身份验证,因此您可以轻松创建一个执行此操作的HOC

const RequireAuth = (Component) => {

    return class App extends Component {

        componentWillMount() { 
            const getToken = localStorage.getItem('token'); 
            if(!getToken) { 
               this.props.history.replace({pathname: '/'}); 
            } 
        } 
        render() { 
           return <Component {...this.props} /> 
        }
    }

}

export { RequireAuth }

并像这样使用

<Route path={"/Dashboard"} component={RequireAuth(Dashboard)}/>

编辑:如果您需要进行网络呼叫以查找是否经过身份验证的使用,则可以将HOC编写为

 const RequireAuth = (Component) => {

    return class App extends Component { 
        state = {
            isAuthenticated: false,
            isLoading: true
        }

        componentDidMount() {
            AuthCall().then(() => {
                this.setState({isAuthenticated: true, isLoading: false});
            }).catch(() => {
                this.setState({isLoading: false});
            })
        } 
        render() { 
           const { isAuthenticated, isLoading } = this.state;
           if(isLoading) {
               return <div>Loading...</div>
           }
           if(!isAuthenticated) {
               return <Redirect to="/login" />
           }
           return <Component {...this.props} /> 
        }
    }

}

export { RequireAuth }

更新:

除了HOC,您还可以选择PrivateRoute类似

const PrivateRoute = ({component: Component, isAuthenticated, isLoading, ...rest }) => { 
           if(isLoading) {
               return <div>Loading...</div>
           }
           if(!isAuthenticated) {
               return <Redirect to="/login" />
           }
           return <Component {...this.props} /> 
        }
    } 
}

 export { PrivateRoute };

你可以像这样使用它

  class App extends Component { 
        state = {
            isAuthenticated: false,
            isLoading: true
        }

        componentDidMount() {
            AuthCall().then(() => {
                this.setState({isAuthenticated: true, isLoading: false});
            }).catch(() => {
                this.setState({isLoading: false});
            })
        } 
        render() { 
           <Router>
              <div>
                  <Route exact path={"/"} component={Home} />
                  <Route path={"/SignUp"} component={SignUp} />
                  <Route path={"/SignIn"} component={SignIn} />
                  <PrivateRoute path={"/Dashboard"} component={Dashboard} isAuthenticated={this.state.isAuthenticated} isLoading={this.isLoading}/>
               </div>
           </Router>
        }
    }


 类似资料:
  • 问题内容: 我已经在应用程序中将React Router升级到了版本4。但是现在我得到了错误 此路由有什么问题? 问题答案: IndexRoute和browserHistory在最新版本中不可用,并且Routes不接受带有v4的子级Routes,您可以在组件本身中指定Routes 然后在主要部分 同样在汽车组件中 您将拥有

  • 问题内容: 我对React还是比较陌生,我正在尝试弄清楚如何使React路由器正常工作。我有一个超级简单的测试应用程序,看起来像这样: 当我运行该应用程序时,home组件加载没有任何麻烦,并且当我单击“ Click Me”链接时,URL更改为localhost / about,但是什么也没有发生。如果单击刷新,则会显示“无法获取/关于”。显然我在做错事,但我一直无法弄清楚是什么。我也在使用Webp

  • 问题内容: 我目前正在使用React Router v4来嵌套路由。 最接近的示例是React-Router v4文档中的route配置 。 我想将我的应用分为2个不同的部分。 前端和管理区域。 我在想这样的事情: 前端的布局和样式与管理区域不同。因此,在首页中,回家的路线大约应该是子路线。 / home 应该呈现在Frontpage组件中, / admin / home 应该呈现在Backend

  • 问题内容: 我有一个问题要阻止未经授权的用户访问仅授权的路由/组件-例如登录的用户仪表板 我有以下代码: 路由器: 我尝试记录日志以检查是否已输入条件,但是从渲染函数收到错误消息,提示它无法读取null属性。 有没有办法解决我的问题,并且有更好的方法来满足我的要求?只有授权用户才能严格访问特定组件 问题答案: 警告:以下答案使用React的旧上下文API。 如果您使用的是V16.3 +,则以下答案

  • 我正在用React和Spring Boot构建一个完整的堆栈应用程序,但是遇到了一个问题,我在任何地方都没有找到答案。 我试图实现的行为如下: > 如果用户想要访问登录或注册页面,我想要重定向用户到主页,如果他们被认证。在redux中,我在应用程序首次加载时设置了一个标志。 我还想重定向用户到登录页面,如果他们没有经过身份验证,并试图访问主页。 第一个目标工作正常,因为有很多教程解释如何使用反应路

  • 问题内容: 我正在创建SPA,并尝试使用软件包版本在应用程序中设置“路由” 。 我的路线定义如下: 基本上,我想设置路由,以便对未定义路由的页面的任何请求都转到组件。 如何做到这一点?上面的解决方案在请求页面时同时呈现和组件。 亲切的问候 问题答案: 这是官方教程中的示例,如何避免呈现多条路线