В настоящее время я борюсь с вложенными маршрутами, используя реакционный маршрутизатор v4.
Наиболее близким примером была конфигурация маршрута в документации React-Router v4 .
Я хочу разделить свое приложение на 2 части.
Интерфейс и админка.
Я думал о чем-то вроде этого:
<Match pattern="/" component={Frontpage}>
<Match pattern="/home" component={HomePage} />
<Match pattern="/about" component={AboutPage} />
</Match>
<Match pattern="/admin" component={Backend}>
<Match pattern="/home" component={Dashboard} />
<Match pattern="/users" component={UserPage} />
</Match>
<Miss component={NotFoundPage} />
Интерфейс имеет другой дизайн и стиль, нежели область администратора. Таким образом, на главной странице маршрут дома, около и так должно быть дочерние маршруты.
/ home должен отображаться в компоненте Frontpage, а / admin / home должен отображаться в компоненте Backend.
Я пробовал некоторые варианты, но я всегда заканчивал тем, что не нажал / home или / admin / home.
Изменить - 19.04.2017
Поскольку этот пост имеет много просмотров прямо сейчас, я обновил его с окончательным решением. Надеюсь, это кому-нибудь поможет.
Изменить - 08.05.2017
Удалены старые решения
Окончательное решение:
Это последнее решение, которое я использую прямо сейчас. Этот пример также имеет компонент глобальной ошибки, такой как традиционная страница 404.
import React, { Component } from 'react';
import { Switch, Route, Redirect, Link } from 'react-router-dom';
const Home = () => <div><h1>Home</h1></div>;
const User = () => <div><h1>User</h1></div>;
const Error = () => <div><h1>Error</h1></div>
const Frontend = props => {
console.log('Frontend');
return (
<div>
<h2>Frontend</h2>
<p><Link to="/">Root</Link></p>
<p><Link to="/user">User</Link></p>
<p><Link to="/admin">Backend</Link></p>
<p><Link to="/the-route-is-swiggity-swoute">Swiggity swooty</Link></p>
<Switch>
<Route exact path='/' component={Home}/>
<Route path='/user' component={User}/>
<Redirect to={{
state: { error: true }
}} />
</Switch>
<footer>Bottom</footer>
</div>
);
}
const Backend = props => {
console.log('Backend');
return (
<div>
<h2>Backend</h2>
<p><Link to="/admin">Root</Link></p>
<p><Link to="/admin/user">User</Link></p>
<p><Link to="/">Frontend</Link></p>
<p><Link to="/admin/the-route-is-swiggity-swoute">Swiggity swooty</Link></p>
<Switch>
<Route exact path='/admin' component={Home}/>
<Route path='/admin/user' component={User}/>
<Redirect to={{
state: { error: true }
}} />
</Switch>
<footer>Bottom</footer>
</div>
);
}
class GlobalErrorSwitch extends Component {
previousLocation = this.props.location
componentWillUpdate(nextProps) {
const { location } = this.props;
if (nextProps.history.action !== 'POP'
&& (!location.state || !location.state.error)) {
this.previousLocation = this.props.location
};
}
render() {
const { location } = this.props;
const isError = !!(
location.state &&
location.state.error &&
this.previousLocation !== location // not initial render
)
return (
<div>
{
isError
? <Route component={Error} />
: <Switch location={isError ? this.previousLocation : location}>
<Route path="/admin" component={Backend} />
<Route path="/" component={Frontend} />
</Switch>}
</div>
)
}
}
class App extends Component {
render() {
return <Route component={GlobalErrorSwitch} />
}
}
export default App;
previousLocation
логика.Ответы:
В реакции-маршрутизатор-v4 вы не гнездитесь
<Routes />
. Вместо этого вы кладете их внутрь другого<Component />
.Например
должен стать
с участием
Вот простой пример , прямо из реагировать маршрутизаторы документации .
источник
to="exampleTopicId"
с${match.url}
того неявным.react-router v6
Обновление до 2020 года: в следующем выпуске v6 будут вложенные
Route
компоненты Just Work ™. Смотрите пример кода в этом посте .В то время как первоначальный вопрос касается версии v4 / v5 , правильный ответ, когда корабли v6 будут просто использовать его, если можете . Это в настоящее время в альфа.
react-router v4 & v5
Это правда, что для вложения маршрутов вам необходимо поместить их в дочерний компонент маршрута.
Однако, если вы предпочитаете более встроенный синтаксис, а не разбиваете свои маршруты между компонентами, вы можете предоставить функциональный компонент для
render
опоры того маршрута, в который вы хотите вложить.Если вам интересно, почему
render
следует использовать реквизит, а неcomponent
реквизит, это потому, что он предотвращает перемонтирование встроенного функционального компонента при каждом рендере. Смотрите документацию для более подробной информации.Обратите внимание, что в этом примере вложенные маршруты обертываются во фрагмент . До React 16 вы можете использовать контейнер
<div>
.источник
match.path
, а неmatch.url
. Первый обычно используется вpath
опоре Route ; последний, когда вы нажимаете новый маршрут (например, Linkto
prop)Просто хотел упомянуть, что реакции-маршрутизатор v4 изменились радикально, так как этот вопрос был опубликован / ответил.
Там нет
<Match>
компонента больше!<Switch>
убедиться, что отображается только первое совпадение.<Redirect>
хорошо .. перенаправляет на другой маршрут. Используйте или пропустите,exact
чтобы включить или исключить частичное совпадение.Смотрите документы. Они великолепны. https://reacttraining.com/react-router/
Вот пример, который, я надеюсь, пригодится для ответа на ваш вопрос.
Надеюсь, это помогло, дайте мне знать. Если этот пример недостаточно хорошо отвечает на ваш вопрос, скажите мне, и я посмотрю, смогу ли я его изменить.
источник
exact
наRedirect
reacttraining.com/react-router/web/api/Redirect Это было бы чище , чем много ,<Route exact path="/" render={() => <Redirect to="/path" />} />
что я делаю вместо этого. По крайней мере, это не позволит мне с TypeScript.Что-то вроде этого.
источник
Мне удалось определить вложенные маршруты, обернув
Switch
и определив вложенный маршрут до корневого маршрута.Ссылка: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/Switch.md
источник
Вы можете попробовать что-то вроде Routes.js
App.js
Я думаю, что вы можете достичь того же отсюда.
источник
источник