2017-03-16 109 views
8

如何在世界上使用react-router,特別是版本4.x中的嵌套路由?在以前的版本以下行之有效...爲什麼我不能在react-router 4.x中嵌套Route組件?

<Route path='/stuff' component={Stuff}> 
    <Route path='/stuff/a' component={StuffA} /> 
</Route> 

升級到4.x的拋出以下警告...

警告:你不應該使用<路線>組件和<路線孩子>在同一條路線上; <路線兒童>將被忽略

什麼在這裏發生了什麼?我搜索了the docs數小時,無法成功獲取嵌套路線。如何使用<Route>組件將其路由嵌套在react-router v4中?我的簡單示例如何轉換爲v4.x API合規性以嵌套路由?

+0

https://reacttraining.com/react-router/web/example/route-config 是不是這個例子中的文檔,你在找什麼? 'RouteWithSubRoutes'特別是 – paqash

+1

可能的重複[嵌套路由與反應路由器v4](http://stackoverflow.com/questions/41474134/nested-routes-with-react-router-v4) – paqash

回答

11

忘記你對React Router < v4的瞭解。你通過嵌套<Routes>嵌套路線。檢查this example。具體檢查一下主題組件。您不需要預先聲明路由,而是在組件呈現時動態地聲明路由。

import React from 'react' 
import { 
    BrowserRouter as Router, 
    Route, 
    Link 
} from 'react-router-dom' 

const BasicExample =() => (
    <Router> 
    <div> 
     <ul> 
     <li><Link to="/">Home</Link></li> 
     <li><Link to="/about">About</Link></li> 
     <li><Link to="/topics">Topics</Link></li> 
     </ul> 

     <hr/> 

     <Route exact path="/" component={Home}/> 
     <Route path="/about" component={About}/> 
     <Route path="/topics" component={Topics}/> 
    </div> 
    </Router> 
) 

const Home =() => (
    <div> 
    <h2>Home</h2> 
    </div> 
) 

const About =() => (
    <div> 
    <h2>About</h2> 
    </div> 
) 

const Topics = ({ match }) => (
    <div> 
    <h2>Topics</h2> 
    <ul> 
     <li> 
     <Link to={`${match.url}/rendering`}> 
      Rendering with React 
     </Link> 
     </li> 
     <li> 
     <Link to={`${match.url}/components`}> 
      Components 
     </Link> 
     </li> 
     <li> 
     <Link to={`${match.url}/props-v-state`}> 
      Props v. State 
     </Link> 
     </li> 
    </ul> 

    {/* NESTED ROUTES */} 
    <Route path={`${match.url}/:topicId`} component={Topic}/> 
    <Route exact path={match.url} render={() => (
     <h3>Please select a topic.</h3> 
    )}/> 
    </div> 
) 

const Topic = ({ match }) => (
    <div> 
    <h3>{match.params.topicId}</h3> 
    </div> 
) 

export default BasicExample 
+0

真棒謝謝你的詳細的答案。當我有機會檢查這一點時,我會回到你的明天 - 但你的例子看起來很有希望。我必須說,我對api的變化感到非常失望,並且很可能沒有這個庫。 – scniro

+1

不用擔心。給V4一個機會。起初它會感覺有點奇怪,但是有一個非常好的理由將API改爲這個。它更強大,而且「只是組件」。 –

+0

我看着這個,它確實很好。但是,當我的主動類風格與兒童衝突時遇到更多問題。經過一段時間的頭痛之後,我開始使用router5,它配備了自己瘋狂的行李。希望在反應路由是愚蠢的簡單,如ui路由器是在角1.x.無論如何,謝謝! – scniro

相關問題