Réagir Routeur v4 avec plusieurs mises en page
Je tiens à rendre certains de mes itinéraires à l'intérieur de ma mise en page, et quelques autres routes à l'intérieur de ma mise en page, est-il un moyen propre de faire cela?
Exemple qui de toute évidence ne fonctionne pas, mais j'espère explique à peu près ce que je recherche:
<Router>
<PublicLayout>
<Switch>
<Route exact path="/" component={HomePage} />
<Route exact path="/about" component={AboutPage} />
</Switch>
</PublicLayout>
<PrivateLayout>
<Switch>
<Route exact path="/profile" component={ProfilePage} />
<Route exact path="/dashboard" component={DashboardPage} />
</Switch>
</PrivateLayout>
</Router>
J'aimerais que la mise en page pour basculer sur certains itinéraires, comment puis-je le faire avec la nouvelle réagir routeur?
De nidification des routes ne fonctionne plus et me donne cette erreur:
You should not use <Route component> and <Route children> in the same route; <Route children> will be ignored
Edit: après Avoir mises en page envelopper des groupes entiers de routes signifie aussi que ces dispositions ne sont rendus qu'une seule fois tant que vous restez dans la même privé/public groupe de voies. C'est une grosse affaire si votre mise en page a pour aller chercher quelque chose à partir de votre serveur par exemple, comme cela serait le cas à chaque changement de page si vous enveloppez chaque page avec une mise en page.
- La Conversation ici: github.com/ReactTraining/react-router/issues/3928
- Tutoriel ici: simonsmith.io/réutilisation des-mises-en-réagir-routeur-4
- avez-vous été en mesure de trouver un moyen propre à le faire.
- Utilisation simple helper library npmjs.com/package/react-router4-with-layouts
Vous devez vous connecter pour publier un commentaire.
Ce que j'ai fait pour cela est de créer un composant simple qui ajoute un supplément de propriété à la Route de la composante qui est la mise en page:
Alors dans votre cas, vos itinéraires ressemblerait à ceci
<Switch><PublicLayout> <Route path="/" component={HomePage}/> <Route path="/about" component={AboutPage}/></PublicLayout> <PrivateLayout><Route path="/profile" component={ProfilePage}/> <Route path="/dashboard" component={DashboardPage}/></PrivateLayout> </Switch>
exact
accessoires pour laRouteWithLayout
:<Switch><RouteWithLayout exact ... >
. En passant à laRoute
direct de l'enfant de ne pas travailler. Ma conjecture est<Switch>
seulement tenir compte de laexact
accessoires de son propre enfant direct, même si ce n'est pas unRoute
composant, mais un wrapper.Switch
a été imbriquée à l'intérieur de la mise en page.Si vous utilisez Tapuscrit et souhaitez suivre cette réagissent approche de mise en page vous pouvez déclarer votre mise en page comme ceci:
Et de déclarer de tels axes:
Je ne pense pas que les mises en place dans le parcours des fichiers.
Garder la route propre, c'est à dire:
Puis, dans la
HomePage
composant, envelopper le rendu du contenu de la mise en page de choix:De cette façon, les routes restent super propre, de plus, vous avez un moyen facile d'afficher des itinéraires qui doivent prendre en charge les mises en page (pages d'erreur 404 par exemple).
HomePage
composant.J'ai essayé Florians réponse, mais ce n'était pas assez pour moi que de réagir permettra de créer une instance distincte de votre Mise en page pour chaque itinéraire, par conséquent, toute navigation transitions comme un onglet coulissante sera tué.
Je suis en espérant une solution plus élégante, mais c'est mon application fonctionne à nouveau avec v4.
Définir une Route pointant vers un composant qui va décider de ce qu'à envelopper la route dans
Dans AppWrap faire quelque chose comme
Itinéraire Config peut-être pourrait être utilisé pour un nettoyant pour la représentation de ce fait, pas sûr.
Je vais écrire ce partout où cette question a été posée, donc désolé si vous l'avez vu ailleurs.
Je suis seul à le faire, car j'ai lutté pendant un certain temps et je pense que ça vaut la diffusion de cette solution autant que possible.
Assez de mots, c'est ce que j'ai fait, je pense que c'est assez explicite. Fonctionne comme un charme et il est très facile de taper.
Mise à jour: j'ai résolu d'une autre façon, mais si vous oblige à l'espace de noms les différentes parties de votre application avec le /app ou /admin par exemple.
Chacun des composants UserRoutes, AdminRoutes et PublicRoutes sont à la base de gros composants de Commutateur avec la mise en page spécifique à sa racine.
Voici à quoi il ressemble:
Ancien: Une solution serait d'utiliser le rendu prop de chaque Itinéraire, mais il semble vraiment lourd:
L'idée est la même que celle de Zaptree mais à l'aide de es6 syntaxe et ajouté des contrôles de sorte qu'il peut être utilisé au lieu de réagir-routeur Route composant
Créer un nouveau composant, disons /src/components/Route/index.js:
Utiliser l'Itinéraire créé composant:
@Qop est correct, cependant, dans les nouveaux Réagir Routeur, j'ai remarqué si vous avez votre chemin de la racine à l'intérieur de l'interrupteur, comme le premier parcours, il sera toujours à la hauteur de l'informatique et, par conséquent, ne jamais afficher vos trajets suivants. Vous devez mettre le chemin de la racine à la fin.
Même idée avec @Zaptree
Disposition
Routes
Cette solution fonctionne.