Imbriqués les routes avec réagissent routeur v4 / v5
Je suis actuellement aux prises avec l'imbrication des itinéraires à l'aide de réagir routeur v4.
Le plus proche de l'exemple est la voie de config dans le
Réagir-Routeur v4 Documentation.
Je veux partager mon app en 2 parties.
Un frontend et une zone d'administration.
Je pensais à quelque chose comme ceci:
<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 autre mise en page et le style de la zone d'administration. Dans le frontpage de l'itinéraire accueil, a propos et donc on devrait être l'enfant routes.
/home doit être affiché dans le composant Frontpage et /admin/home doit être rendue dans le composant d'arrière-plan.
J'ai essayé quelques variations, mais j'ai toujours terminé à ne pas frapper /home ou /admin/home.
Edit - 19.04.2017
Parce que ce post a beaucoup de points de vue maintenant j'ai mis à jour avec la solution finale. J'espère que cela aide quelqu'un.
Edit - 08.05.2017
Retiré vieux solutions
Solution finale:
C'est la dernière solution que je suis en ce moment. Cet exemple a également une erreur globale de la composante traditionnel, à la page 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;
- Merci pour la mise à jour de votre question avec la réponse finale! juste une suggestion: peut-être vous pourriez ne garder que la 4ème inscription et le premier, car les autres sont en utilisant d'anciennes versions de l'api, et sont une distraction de la réponse
- lol, je n'ai aucune idée de ce que le format de la date est: 08.05.2017 je vous suggère d'utiliser l'universel ISO8601 format pour les dates si vous ne voulez pas de confondre les gens. est 08 le mois ou le jour? ISO8601 = année.mois.le jour, l'heure.minutes.deuxième (de plus en plus de granules)
- Belle mise à jour de la solution finale, mais je pense que vous n'avez pas besoin de la
previousLocation
logique. - quelle est la motivation pour la réécriture complète de réagir routeur. Il vaut mieux avoir une bonne raison
- C'est l'approche déclarative. De sorte que vous pouvez configurer vos gammes que vous utilisez réagir composants.
Vous devez vous connecter pour publier un commentaire.
Dans réagissent-routeur-v4 vous n'avez pas de nid
<Routes />
. Au lieu de cela, vous les mettez à l'intérieur une autre<Component />
.Par exemple
devrait devenir
avec
Ici est un exemple de base directement à partir de la réaction-routeur la documentation.
to="exampleTopicId"
avec le${match.url}
étant implicite.url
.Il est vrai que, pour nest les Routes, vous devez les placer dans le composant enfant de la Route.
Toutefois, si vous préférez, plus la syntaxe inline plutôt que de casser votre parcours à travers des composants, vous pouvez fournir une composante fonctionnelle de la
render
prop de l'Itinéraire que vous voulez nid sous.Si vous êtes intéressé à pourquoi le
render
prop doit être utilisé, et pas lecomponent
prop, c'est parce qu'il arrêts de la ligne composante fonctionnelle d'être remonté sur chaque rendu. Voir la documentation pour plus de détails.Notez que l'exemple des enveloppements imbriquée des Routes dans un Fragment. Avant de Réagir de 16 ans, vous pouvez utiliser un conteneur
<div>
à la place.match.path
, pasmatch.url
. Le premier est généralement utilisé dans la Routepath
prop; le second, quand vous appuyez sur un nouvel itinéraire (par ex. un Liento
prop)Voulais juste parler, réagir-routeur v4 changé radicalement depuis que cette question a été postée/answed.
Il n'y a pas de
<Match>
composant plus!<Switch>
est de s'assurer que seul le premier match est rendu.<Redirect>
bien .. redirige vers une autre voie. D'utiliser ou de laisserexact
soit dans ou exclure une correspondance partielle.Voir les docs. Ils sont grands. https://reacttraining.com/react-router/
Voici un exemple, je l'espère, n'est pas utilisable pour répondre à votre question.
Espère que ça a aidé, laissez-moi savoir. Si cet exemple n'est pas de répondre à votre question, dites-moi et je vais voir si je peux le modifier.
exact
surRedirect
reacttraining.com/react-router/web/api/Redirect ce serait beaucoup plus propre que<Route exact path="/" render={() => <Redirect to="/path" />} />
que je suis en train de faire à la place. Au moins, il ne me laisse pas avec la Machine.Quelque chose comme ça.
JS:
Vous pouvez essayer quelque chose comme
Routes.js
App.js
Je pense que vous pouvez obtenir le même à partir d'ici aussi.
J'ai créé ici un exemple de la TSX, si quelqu'un veut se débarrasser de préfixe de wrapper de l'itinéraire de l'enfant route: https://stackoverflow.com/a/47891060/5517306