react-router-dom v4 中的多个嵌套路由

IT技术 javascript reactjs react-router react-router-dom
2021-02-27 10:14:12

我需要 react-router-dom 中的多个嵌套路由

我正在使用 react-router-dom 的 v4

我有我的

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

我需要组件像这样渲染

--- Login
--- Home
    --- Page 1
    --- Page 2
    --- Page 3
--- About
--- etc

Home 组件包含一个 Header 组件,它对于 Page1、Page2 和 Page3 组件是通用的,但在 Login 和 About 中不存在。

我的 js 代码是这样读的

<Router>
    <div>
        <Route path='/login' component={Login} />
        <Home>
            <Route path='/page1' component={Page1} />
            <Route path='/page2' component={Page2} />
            <Route path='/page3' component={Page3} />
        </Home>
        <Route path='/about' component={About} />
    </div>
</Router>

我希望登录组件仅在 /login 上显示当我请求 /page1、/page2、/page3 时,它们应该分别包含 Home 组件和该页面的内容。

我得到的是呈现的登录组件,并在页面 1 的组件下方呈现。

我很确定我遗漏了一些非常微不足道的东西或在某处犯了一个非常愚蠢的错误,并感谢我能得到的所有帮助。过去两天我一直被这个问题困扰。

6个回答

使用从 propsthis.props.match.path获取的 url/path 匹配来获取设置到组件的路径。

定义您的主要路线如下

<Router>
  <div>
    <Route exact path="/" component={DummyIndex} /> {/* Note-1 */}
    <Route path="/login" component={Login} />
    <Route path="/home" component={Home} />
    <Route path="/about" component={About} />
    <Route path="/etc" component={Etc} />
  </div>
</Router>

然后在Home组件中,定义你的路由

class Home extends Component {
  render() {
    return <div>
      <Route exact path={this.props.match.path} component={HomeDefault} />
      <Route path={`${this.props.match.path}/one`} component={HomePageOne} />
      <Route path={`${this.props.match.path}/two`} component={HomePageTwo} />
    </div>
  }
}

定义的路由如下

  • /登录
  • /家
  • /家/一
  • /家/二
  • /关于
  • /等等

如果您想在/home/one/a/home/one/bHomePageOne等中进一步嵌套路由,您可以继续使用相同的方法。

注1:如果您不想进一步嵌套,只需使用 prop 设置路由exact

编辑(2017 年 5 月 15 日)

最初,我使用过props.match.url,现在我将其更改为props.match.path.

我们可以在路由的路径中使用props.match.path代替,props.match.url这样如果你在顶级路由中使用路径参数,你可以通过props.match.params.

如果你没有任何路径参数,props.match.url就足够了

@xiongemi 你是对的。你可以使用,<Switch>但它有一个目的,确保你知道它。
2021-04-20 10:14:12
一条评论:我没有使用 <div>,而是使用 <switch> 来避免不必要的 html 标签。
2021-04-24 10:14:12
@AshishKamble 如果您收到Cannot read property 'path' of undefined,则表示道具match未定义。确保您将正确的组件分配给 Route 中名为“component”的道具
2021-04-28 10:14:12
要摆脱无法读取未定义错误的属性“路径”,您需要在参数中传递道具:(props) => props.match.match.url
2021-05-10 10:14:12
我越来越 TypeError: Cannot read property 'path' of undefined
2021-05-13 10:14:12

在路由器 v4 中使用 Switch 组件

<Router>
<Switch>
  <Route path='/login' component={Login} />
  <Route path='/about' component={About} />
  <Home>
    <Route component={({ match }) =>
      <div>
        <Route path='/page1' component={Page1} />
        <Route path='/page2' component={Page2} />
        <Route path='/page3' component={Page3} />
      </div>
    }/>
  </Home>
</Switch>

export default class Home extends Component {
render() {
    return (
      <div className="Home">
          { this.props.children }
      </div>
    )
  }
}

我认为这段代码展示了使用组件的基本思想。

@RohanBüchner,Home 组件如下所示: export default class Home extends Component { render() { return ( <div className="Home"> { this.props.children } </div> ) } } 我认为这段代码显示了使用组件的基本思想
2021-04-21 10:14:12
@IgorStecyura 你有没有可能分享Home组件的代码
2021-05-06 10:14:12
是的,我看到有问题。我更改了代码,请尝试
2021-05-09 10:14:12
react-router-dom 的 v4 为嵌套路由抛出此警告,Warning: You should not use <Route component> and <Route children> in the same route; <Route children> will be ignored warning并且不会呈现 /page1、/page2 等下的组件
2021-05-12 10:14:12

本周我遇到了同样的问题,我认为该项目已经过去了,因为所有的文档、示例和视频都是针对先前版本的,而版本 4 的文档令人困惑
这就是我完成工作的方式,让我知道这是否有帮助

import React, { Component } from 'react';

import { BrowserRouter, Route, Switch } from 'react-router-dom';

import Root from './Root';
import Home from './Home';
import About from './About';

import './App.css';

class App extends Component {
    render() {
        return (
            <BrowserRouter>
                <div>
                    <Root>
                       <Switch>
                            <Route exact path="/" component={Home} />
                            <Route path="/home" component={Home} />
                            <Route path="/about" component={About} />
                        </Switch>
                    </Root>
                </div>
            </BrowserRouter>
        );
    }
}

export default App;
这种方法是可行的,但只是为了向那些不熟悉 React 继承的人澄清:根组件将需要一个包含 { props.children } 的返回值。
2021-04-30 10:14:12
怎么样HomepageOneHomepageTwo
2021-05-06 10:14:12

将所有子路由移动到父组件并扩展路由,如下所示。
<Route path={`${match.url}/keyword`} component={Topic}/>
还检查react-router培训

使用如下:

class App extends Component {
  render() {
    return (
      <BrowserRouter>
        <Link to='/create'> Create </Link>
        <Link to='/ExpenseDashboard'> Expense Dashboard </Link>
        <Switch>
          <Route path='/ExpenseDashboard' component={ExpenseDashboard} />
          <Route path='/create' component={AddExpensePage} />
          <Route path='/Edit' component={EditPage} />
          <Route path='/Help' component={HelpPage} />
          <Route component={NoMatch} />
        </Switch>
      </BrowserRouter>
    );
  }
}

查看更多 @在 GitHub 上切换