首页 文章

为什么我不能在react-router 4.x中嵌套Route组件?

提问于
浏览
10

如何在react-router中使用嵌套路由,特别是版本4.x?以下版本在以下版本中运行良好...

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

升级到4.x会发出以下警告......

警告:您不应在同一路线中使用<Route>组件和<Route children>; <Route children>将被忽略

到底发生了什么事?我已经搜索了the docs几个小时,无法成功获得嵌套路由 . 如何使用 <Route> 组件将其路由嵌套在react-router v4中?我的简单示例如何转换为嵌套路由的v4.x API合规性?

1 回答

  • 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
    

相关问题