2017-04-08 103 views
1

我怎样才能将用户重定向到一个NOMATCH组件,当我在嵌套路线阵营路由器V4?阵营路由器V4全球不匹配嵌套航线童车

这里是我的代码:

import React from 'react'; 
import ReactDOM from 'react-dom'; 
import injectTapEventPlugin from 'react-tap-event-plugin'; 
injectTapEventPlugin(); 

import { 
    BrowserRouter as Router, 
    Route, 
    Switch 
} 
from 'react-router-dom'; 
import Website from './website/Website'; 

const Register = ({ match}) => { 
    return (
     <div> 
      <Route exact path={match.url} render={() => {return <h1>Register</h1>} } /> 
      <Route path={`${match.url}/detail`} render={()=>{return <h1>Register Detail</h1>}} /> 
     </div> 
    ) 
} 

const App =() => (
    <Router> 
     <Switch> 
       <Route exact path="/" render={() => {return <h1>Home</h1> }} /> 
       <Route path="/register" component={Register} /> 
       <Route component={() => {return <h1>Not found!</h1>}} /> 
     </Switch> 
    </Router> 
); 

ReactDOM.render(
    <App/>, document.getElementById('root')); 

你可以看到,下面有一个注册路线NOMATCH,但我不想用我的子组件注册相同的路由映射。这样,如果我去/注册/未注册匹配页面只显示空白,因为不输入NoMatch路由。

我该如何映射一个全球NOMATCH没有指定我的孩子的路线?我不想将这种责任传递给子组件。

谢谢。

+0

您将需要创建特定的,注册总会渲染不管它里面有一个匹配的子路径或无。所以你需要创建为 –

+0

@ReiDien处理程序。如果我的理解,我需要做的就是创建一个“抽象的”组件encapsuling的NOMATCH处理......我是谁吧?谢谢 – yurikilian

回答

-1

你可以做的就是定义在你的根应用都可能允许路线。因此,使用可选的模式如下调整您的应用程序组件:

const App =() => (
    <Router> 
     <Switch> 
       <Route exact path="/" render={() => {return <h1>Home</h1> }} /> 
       <Route path="/register/(detail)?" exact component={Register} /> 
       <Route component={() => {return <h1>Not found!</h1>}} /> 
     </Switch> 
    </Router> 
); 
+1

谢谢@Javaguru!我试图在不指定主文件的情况下解耦我的组件。只是为了动态导入的目的,因为我不想在主文件中映射我的路线。我知道我可以根据导入创建一个路径文件,但是我正在寻找一种方法在我的模块上执行此操作。 – yurikilian

0

我有开关同样的问题,因为下面将始终使我NOMATCH成分,如果我没有去/ A

<Router history={history}> 
    <Switch> 
    <Route path='/a' component={A} /> 
    <Switch> 
     <Route path='/b' component={B} /> 
     <Route path='/b/:id' component={C} /> 
    </Switch> 
    <Route path="*" component={NoMatch}/> 
    </Switch> 
</Router> 

然而,它会工作,符合市场预期,如果您移动NOMATCH嵌套开关里面是这样的:

<Router history={history}> 
    <Switch> 
    <Route path='/a' component={A} /> 
    <Switch> 
     <Route path='/b' component={B} /> 
     <Route path='/b/:id' component={C} /> 
     <Route path="*" component={NoMatch}/> 
    </Switch> 
    </Switch> 
</Router> 

即使这是一个“解决方案”的问题,这是不是你想要的,因为第二开关是在不同的文件中像第一路线什么为好。

随着应用程序的增长和更多的路线进入不同的文件,你永远不知道在哪里你需要把NoMatch路线让它按预期工作。

你有没有发现任何其他办法解决这个问题?

+0

嗨!我认为这个tois的最佳方法是使用High Order Component来处理找不到的匹配,因为@ReiDien在上面的评论中解释过。我还没有试过。 – yurikilian

+0

我发现不支持嵌套的Switch。因此,在不同文件中配置路由时,您不应该从这些路由中返回Switch。我所做的是返回一个路由数组,持有/ b和/ b /:id路由。 – bjorgvin