Reactjs 中的简单条件路由

新手上路,请多包涵

如何实现条件路由,即当且仅当某些条件满足时,才会发生路由。例如,当且仅当用户输入正确的凭据时,登录应该成功并且用户应该能够看到欢迎页面。

如果我们直接点击 localhost:8080/welcome 类的 URL,则不应导航到欢迎页面。欢迎页面只应在登录后显示。

如何实现这一点,有人可以帮助我吗?

应用程序.js

 import React, { Component } from 'react';
import Header from './Header';

class App extends Component{
  render(){
   return(
     <div>
       <Header />
     </div>
   );
  }
}
export default App;

页眉.js

 import React, { Component } from 'react';
import {Link} from 'react-router-dom';
import Login from './Login';
import SignUp from './SignUp';

class Header extends Component{
render(){
  return(
    <div>
    <nav class="navbar navbar-default">
     <div class="container-fluid">
     <ul class="nav navbar-nav">
      <li><Link to={Login}>Login</Link></li>
      <li><Link to={Login}>SignUp</Link></li>
    </ul>
    </div>
    </nav>

    </div>
   );
 }
}

export default Header;

AllRoutes.js

 import React, { Component } from 'react';
import { Switch, Route } from 'react-router-dom';
import Login from './Login';
import SignUp from './SignUp';
import Welcome from './Welcome';

class AllRoutes extends Component{
 render(){
   return(
     <Switch>
       <Route exact path="/login" component={Login} />
       <Route exact path="/signup" component={SignUp} />
       <Route exact path="/Welcome" component={Welcome} />
     </Switch>
   );
  }
 }
 export default AllRoutes;

欢迎.js

 import React, { Component } from 'react';

class Welcome extends Component{
render(){
 return(
  <div>
   <h2>Welcome to MainPage..</h2>
  </div>
  );
 }
}
export default Welcome;

原文由 Srikanth Gowda 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 556
2 个回答

为了帮助回答您的问题,我认为您可能还需要询问该路线应该 如何 被阻止。通过上面的示例,您还没有一种机制可以帮助回答“我应该能够访问此页面”的问题。这可能来自 state 、redux 或其他确定用户是否登录的方法。

由于 react-router 只是简单的 React(我最喜欢的部分之一!!),您拥有所有可用的工具,您可以有条件地显示您的 React 应用程序的 任何 部分。

以下是您如何实现这一目标的几个示例(这绝不是详尽无遗的。要有创意!这完全取决于您的要求和您使用的工具)

 class AllRoutes extends Component{
  render(){
    return(
      <Switch>
        <Route exact path="/login" component={Login} />
        <Route exact path="/signup" component={SignUp} />
        { this.state.authenticated &&
          <Route exact path="/Welcome" component={Welcome} />
        }
      </Switch>
    );
  }
}

我最喜欢的方法之一是创建一个 ProtectedRoute 组件

class ProtectedRoute extends Component {
  render() {
    const { component: Component, ...props } = this.props

    return (
      <Route
        {...props}
        render={props => (
          this.state.authenticated ?
            <Component {...props} /> :
            <Redirect to='/login' />
        )}
      />
    )
  }
}

class AllRoutes extends Component {
  render() {
    return (
      <Switch>
        <Route path='/login' component={Login} />
        <ProtectedRoute path='/welcome' component={Welcome} />
      </Switch>
    )
  }
}

虽然我没有包含任何关于如何设置 state.authenticated 的具体逻辑,但这可能来自任何地方(绝不需要来自 state )。尽力回答“我如何确定用户是否经过身份验证”的问题,并使用该机制作为处理路由身份验证的手段。

原文由 jerelmiller 发布,翻译遵循 CC BY-SA 4.0 许可协议

为此,您需要将整个应用程序分成两部分,通常可访问的部分和受保护的部分。只有成功登录后才能访问受保护的部分。

要实现该功能,请创建受保护部分的包装器,并使用 path='/' 定义其路由,并将条件放入其中。所有受保护的路由都应在该包装器组件内定义。如果有人试图在没有登录的情况下访问这些路由,wrapper 会将他们重定向到登录页面。

像这样:

 class AllRoutes extends Component{
 render(){
   return(
     <Switch>
       <Route exact path="/login" component={Login} />
       <Route exact path="/signup" component={SignUp} />
       <Route path="/" component={AppWrapper} />
     </Switch>
   );
  }
 }

AppWrapper 组件(假设您正在使用某种方式来维护用户是否登录,所以在 if 条件下进行适当的检查):

 import { Redirect } from 'react-router-dom'

class AppWrapper extends Component{
  render(){

  if(/*not login*/)
    return <Redirect to="/login" />

   return(
     <div>
       App wrapper
       <Route path='/Welcome' component={Welcome} />
     </div>
   );
  }
}

原文由 Mayank Shukla 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进