我需要在react-router-dom
中使用多个嵌套路由我使用的是react-react-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组件只显示在/ login上 当我请求/ page1,/ page2,/ page3时,它们应分别包含Home组件和该页面的内容。
我得到的是呈现的Login组件,下面是呈现Page1的组件。
我很确定我错过了一些非常微不足道的事情,或者在某个地方犯了一个非常愚蠢的错误,并且非常感谢我能得到的所有帮助。过去两天我一直坚持这个。
答案 0 :(得分:41)
使用从道具this.props.match.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>
}
}
定义的路线如下
如果您想在HomePageOne
中进一步嵌套路线,例如 / home / one / a 和 / home / one / b ,您可以继续进行做法。
注意1:如果您不想进一步嵌套,只需使用道具exact
设置路线。
编辑(2017年5月15日)
最初,我使用了props.match.url
,现在我将其更改为props.match.path
。
我们可以在Route的路径中使用props.match.path
而不是props.match.url
,这样如果您在顶级路由中使用路径参数,则可以通过props.match.params
在内部(嵌套)路径中获取它。
如果你没有任何路径参数,props.match.url
就足够了
答案 1 :(得分:7)
在路由器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>
)
}
}
我认为此代码显示了使用组件的基本思路。
答案 2 :(得分:3)
本周我遇到了同样的问题,我认为该项目的时间过于混乱,因为所有文档,示例和视频都是针对以前的版本而版本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;
答案 3 :(得分:1)
将所有子路由移动到父组件并像下面一样扩展路由。
<Route path={`${match.url}/keyword`} component={Topic}/>
还要检查react router training
答案 4 :(得分:0)
使用如下所示:
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>
);
}
}
查看更多@ Switch on GitHub
答案 5 :(得分:-1)
我遇到了同样的问题,我就这样解决了
<BrowserRouter>
<UserAuthProvider>
<Root>
<Switch>
<GuardRoute type="public" exact path="/" component={Login} />
<GuardRoute type="private" exact path="/home" component={Home} />
<GuardRoute
type="private"
exact
path="/home/mascotas"
component={Mascotas}
/>
</Switch>
</Root>
</UserAuthProvider>
</BrowserRouter>