Ich habe derzeit Probleme mit der Verschachtelung von Routen mit React Router v4.
Das nächste Beispiel war die Routenkonfiguration in der React-Router v4-Dokumentation .
Ich möchte meine App in 2 verschiedene Teile teilen.
Ein Frontend und ein Admin-Bereich.
Ich habe über so etwas nachgedacht:
<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} />
Das Frontend hat ein anderes Layout und einen anderen Stil als der Admin-Bereich. Also innerhalb der Titelseite die Route nach Hause, ungefähr und so sollte man die untergeordneten Routen sein.
/ home sollte in die Frontpage-Komponente und / admin / home in die Backend-Komponente gerendert werden.
Ich habe einige Variationen ausprobiert, aber ich habe immer nicht / home oder / admin / home getroffen.
Bearbeiten - 19.04.2017
Da dieser Beitrag momentan viele Ansichten hat, habe ich ihn mit der endgültigen Lösung aktualisiert. Ich hoffe es hilft jemandem.
Bearbeiten - 08.05.2017
Alte Lösungen entfernt
Endgültige Lösung:
Dies ist die endgültige Lösung, die ich gerade verwende. Dieses Beispiel enthält auch eine globale Fehlerkomponente wie eine herkömmliche 404-Seite.
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
Logik nicht.Antworten:
In React-Router-v4 verschachteln Sie nicht
<Routes />
. Stattdessen steckst du sie in eine andere<Component />
.Zum Beispiel
soll werden
mit
Hier ist ein grundlegendes Beispiel direkt aus der React-Router- Dokumentation .
quelle
to="exampleTopicId"
mit dem${match.url}
impliziten Sein.react-router v6
Ein Update für 2020: Die kommende Version 6 wird verschachtelte
Route
Komponenten enthalten, die Just Work ™ enthalten. Siehe Beispielcode in diesem Blogbeitrag .Während sich die ursprüngliche Frage auf v4 / v5 bezieht , wird die richtige Antwort bei v6- Schiffen nur verwendet, wenn Sie können . Es ist derzeit in Alpha.
react-router v4 & v5
Es ist richtig, dass Sie zum Verschachteln von Routen diese in der untergeordneten Komponente der Route platzieren müssen.
Wenn Sie jedoch eine Inline-Syntax bevorzugen, anstatt Ihre Routen komponentenübergreifend aufzuteilen, können Sie der
render
Requisite der Route, unter der Sie verschachteln möchten , eine funktionale Komponente bereitstellen .Wenn Sie daran interessiert sind, warum die
render
Requisite verwendet werden sollte und nicht diecomponent
Requisite, liegt dies daran, dass die Inline-Funktionskomponente nicht bei jedem Rendern erneut bereitgestellt wird. Weitere Informationen finden Sie in der Dokumentation .Beachten Sie, dass das Beispiel die verschachtelten Routen in ein Fragment einschließt . Vor React 16 können Sie
<div>
stattdessen einen Container verwenden.quelle
match.path
nicht verwendenmatch.url
. Ersteres wird normalerweise in der Route-path
Requisite verwendet. Letzteres, wenn Sie eine neue Route schieben (z. B. Linkto
Prop)Ich wollte nur erwähnen, dass sich React-Router v4 radikal geändert hatIch React seit diese Frage gestellt / beantwortet wurde.
Es gibt keine
<Match>
Komponente mehr!<Switch>
soll sicherstellen, dass nur die erste Übereinstimmung gerendert wird.<Redirect>
gut .. leitet zu einer anderen Route weiter. Verwenden oder weglassenexact
weglassen, um eine Teilübereinstimmung ein- oder auszuschließen.Siehe die Dokumente. Sie sind großartig. https://reacttraining.com/react-router/
Hier ist ein Beispiel, das hoffentlich zur Beantwortung Ihrer Frage verwendet werden kann.
Hoffe es hat geholfen, lass es mich wissen. Wenn dieses Beispiel Ihre Frage nicht gut genug beantwortet, sagen Sie es mir und ich werde sehen, ob ich es ändern kann.
quelle
exact
aufRedirect
reacttraining.com/react-router/web/api/Redirect. Das wäre viel sauberer als das<Route exact path="/" render={() => <Redirect to="/path" />} />
, was ich stattdessen mache. Zumindest lässt es mich nicht mit TypeScript.Etwas wie das.
quelle
Es ist mir gelungen, verschachtelte Routen zu definieren, indem ich verschachtelte Routen
Switch
vor der Root-Route umbrochen und definiert habe.Referenz: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/Switch.md
quelle
Sie können so etwas wie Routes.js ausprobieren
App.js.
Ich denke, dass Sie das auch von hier aus erreichen können.
quelle
quelle