【问题标题】:Redirect all routes in react router重定向反应路由器中的所有路由
【发布时间】:2018-08-13 21:17:08
【问题描述】:

我有一个 React/Redux 应用程序,如果用户在再次登录时尚未完成注册过程,我希望他们被重定向到他们所在步骤的注册路径,无论他们尝试走哪条路径到。对我来说最好的方法是什么,而不必为我的每条路线都使用该逻辑制作自定义路线?这是我的基本路由器:

render() {
  return (
   <Router history={history}>
     <Switch>
       <HomeRoute exact path="/" publicComp={Start} privateComp={Rooms}/>
       <Route path="/login" component={Login}/>
       <Route path="/signup" component={SignUpMain}/>
    </Switch>
   </Router>
  );
}

理想情况下,我可以说“如果注册未完全重定向到 /signup,则在所有这些路由上”。有没有办法做到这一点?

【问题讨论】:

  • 请添加你的 react-router 版本

标签: javascript reactjs react-router


【解决方案1】:

一种方法是用重定向到注册的高阶组件替换您的 Route 组件。

const RedirectRoute = ({ component: Component, ...rest }) => (
  <Route
    {...rest}
    render={props =>
        <Redirect
          to="/signup"
        />
    }
  />
);

如果您使用上面的路由器将高阶组件添加到文件底部,那么您可以像这样替换路由组件...

render() {
  return (
   <Router history={history}>
     <Switch>
       <RedirectRoute exact path="/" render={() => <HomeRoute exact path="/" publicComp={Start} privateComp={Rooms}/>}/>
       <RedirectRoute path="/login" component={Login}/>
       <Route path="/signup" component={SignUpMain}/>
    </Switch>
   </Router>
  );
 }

如果您想将高阶组件保存在单独的文件中,则只需像导入任何其他组件一样导入它即可。

【讨论】:

  • 如果高阶组件对您来说是新的,不要让它们吓倒您。它们只是可以将另一个组件作为道具的组件。当您发现自己重复的事情很像您要单独重定向每条路线时,它们会很方便。更多的文档在这里reactjs.org/docs/higher-order-components.html
  • 我已经有一个自定义组件 ,其中包含有关重定向的自定义逻辑。我计划拥有更多这样的路线和自定义路线,因此需要一种方法来拥有更高级别的逻辑来指示所有这些路线。在您的解决方案中,我的 似乎消失了。我可以在 的已经高阶组件之上做一个高阶组件吗
  • 是的,您可以用同样的方式制作更高、更高阶的组件。你像这样传递它...&lt;RedirectRoute exact path="/" render={() =&gt; &lt;HomeRoute exact path="/" publicComp={Start} privateComp={Rooms}/&gt;}/&gt;。我将编辑我的回复以包含该内容。
  • 也就是说,我最初采取了这一措施,以避免在 Route 组件中使用 component={}render={() =&gt; # } 之间可能出现任何混淆,因为这无关紧要。您正在重定向,因此您传入的组件无关紧要。
  • 对于其他阅读本文的人来说,不同之处在于渲染方法允许您通过组件传递道具。这里解释youtube.com/watch?v=By7vJuSPaYo
猜你喜欢
  • 2020-10-22
  • 1970-01-01
  • 2017-09-17
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2019-10-03
相关资源
最近更新 更多