Je suis actuellement aux prises avec des routes d'imbrication utilisant le routeur React v4.
L'exemple le plus proche était la configuration de route dans la documentation React-Router v4 .
Je souhaite diviser mon application en 2 parties différentes.
Un frontend et une zone d'administration.
Je pensais à quelque chose comme ça:
<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} />
Le frontend a une disposition et un style différents de ceux de la zone d'administration. Ainsi, en première page, l'itinéraire vers la maison, environ et donc l'un devrait être les itinéraires enfants.
/ home doit être rendu dans le composant Frontpage et / admin / home doit être rendu dans le composant Backend.
J'ai essayé quelques variantes mais j'ai toujours fini par ne pas frapper / home ou / admin / home.
Éditer - 19.04.2017
Parce que ce message a beaucoup de vues en ce moment, je l'ai mis à jour avec la solution finale. J'espère que ça aide quelqu'un.
Éditer - 08.05.2017
Suppression des anciennes solutions
Solution finale:
Ceci est la solution finale que j'utilise en ce moment. Cet exemple a également un composant d'erreur global comme une page 404 traditionnelle.
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
logique.Réponses:
Dans react-router-v4, vous ne vous imbriquez pas
<Routes />
. Au lieu de cela, vous les mettez dans un autre<Component />
.Par exemple
devrait devenir
avec
Voici un exemple de base directement issu de la documentation de react-router .
la source
to="exampleTopicId"
avec l'${match.url}
être implicite.react-router v6
Une mise à jour pour 2020: la prochaine version v6 aura des
Route
composants imbriqués Just Work ™. Voir l'exemple de code dans cet article de blog .Alors que la question d'origine concerne la v4 / v5 , la bonne réponse lorsque les vaisseaux v6 seront utilisés si vous le pouvez . Il est actuellement en alpha.
react-router v4 & v5
Il est vrai que pour imbriquer des routes, vous devez les placer dans le composant enfant de la route.
Cependant, si vous préférez une syntaxe plus en ligne plutôt que de diviser vos itinéraires en plusieurs composants, vous pouvez fournir un composant fonctionnel à l'
render
accessoire de l'itinéraire sous lequel vous souhaitez imbriquer.Si vous êtes intéressé par la raison pour laquelle l'
render
hélice doit être utilisée, et non par l'component
hélice, c'est parce qu'elle empêche le composant fonctionnel en ligne d'être remonté sur chaque rendu. Voir la documentation pour plus de détails.Notez que l'exemple enveloppe les routes imbriquées dans un fragment . Avant React 16, vous pouvez utiliser un conteneur à la
<div>
place.la source
match.path
, nonmatch.url
. Le premier est généralement utilisé dans l'path
hélice Route ; ce dernier lorsque vous poussez un nouvel itinéraire (par exemple Linkto
prop)Je voulais juste mentionner que react-router v4 a changé radicalement depuis que cette question a été publiée / répondue.
Il n'y a plus de
<Match>
composant!<Switch>
est de s'assurer que seule la première correspondance est rendue.<Redirect>
bien .. redirige vers un autre itinéraire. Utilisez ou omettezexact
pour inclure ou exclure une correspondance partielle.Voir les documents. Ils sont grands. https://reacttraining.com/react-router/
Voici un exemple que j'espère utilisable pour répondre à votre question.
J'espère que cela a aidé, faites le moi savoir. Si cet exemple ne répond pas assez bien à votre question, dites-le moi et je verrai si je peux le modifier.
la source
exact
surRedirect
reacttraining.com/react-router/web/api/Redirect Ce serait beaucoup plus propre que ce<Route exact path="/" render={() => <Redirect to="/path" />} />
que je fais à la place. Au moins, cela ne me laissera pas avec TypeScript.Quelque chose comme ça.
la source
J'ai réussi à définir des routes imbriquées en encapsulant
Switch
et en définissant une route imbriquée avant la route racine.Référence: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/Switch.md
la source
Vous pouvez essayer quelque chose comme Routes.js
App.js
Je pense que vous pouvez réaliser la même chose à partir d'ici aussi.
la source
la source