Несколько вложенных маршрутов в agent-router-dom v4
Мне нужно несколько вложенных маршрутов в response-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 будет отображаться только в /login
Когда я запрашиваю /page 1,/page2,/page3, они должны содержать компонент Home и этот контент соответственно.
Вместо этого я получаю визуализированный компонент входа и ниже этого компонента Page1.
Я почти уверен, что я пропустил что-то очень тривиальное или совершил действительно глупую ошибку где-то, и был бы признателен за всю помощь, которую я мог получить. Я застрял с этим в течение последних двух дней.
Ответы
Ответ 1
Используйте совпадение URL/пути, полученное из реквизита 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: Если вы не хотите больше вложенности, просто установите маршрут с помощью prop exact
.
EDIT (15 мая 2017 года)
Сначала я использовал props.match.url
, и теперь я изменил его на props.match.path
.
Мы можем использовать props.match.path
вместо props.match.url
в пути маршрута, так что если вы используете параметры пути в маршрутах верхнего уровня, вы можете получить его во внутренних (вложенных) маршрутах через props.match.params
.
Если у вас нет каких-либо параметров пути, props.match.url
достаточно
Ответ 2
На этой неделе у меня была такая же проблема, я думаю, что проект проходит время путаницы, потому что все документы, примеры и видео предназначены для предыдущих версий, а документы для версии 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
Использовать компонент Switch в маршрутизаторе v4
<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>
экспорт по умолчанию класс Home extends Component {
render() { вернуть ( {this.props.children} ) }
}
Я думаю, что этот код показывает основную идею использования компонента.
Ответ 4
Переместите все дочерние маршруты в родительский компонент и продолжите маршрут, как показано ниже.
<Route path={`${match.url}/keyword`} component={Topic}/>
также проверьте реагировать на обучение маршрутизатора
Ответ 5
Используйте как показано ниже:
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