65 votes

Routes imbriquées dans React Router v4

J'essaie de mettre en place des routes imbriquées pour ajouter une mise en page commune. Vérifiez le code :

  <Router>
    <Route component={Layout}>
      <div>
        <Route path='/abc' component={ABC} />
        <Route path='/xyz' component={XYZ} />
      </div>
    </Route>
  </Router>

Bien que cela fonctionne parfaitement, je reçois toujours l'avertissement :

Avertissement : Vous ne devez pas utiliser <Route component> et <Route children> dans la même route ; elles seront ignorées

5 votes

83voto

Ilan Schemoul Points 1030

La réponse du CESCO rend d'abord la composante AppShell puis l'un des composants à l'intérieur Switch . Mais ces composants ne seront PAS rendus à l'intérieur de l'appareil. AppShell ils ne seront PAS des enfants de AppShell .

Dans la v4 pour envelopper les composants vous ne mettez plus votre Route à l'intérieur d'un autre Route vous mettez votre Route directement dans un composant.
I.E : pour le wrapper au lieu de <Route component={Layout}> vous utilisez directement <Layout> .

Code complet :

  <Router>
    <Layout>
      <Route path='/abc' component={ABC} />
      <Route path='/xyz' component={XYZ} />
    </Layout>
  </Router>

Le changement s'explique probablement par l'idée de faire de React Router v4 un pur React. React afin que vous n'utilisiez que des éléments React comme avec n'importe quel autre élément React.

EDIT : J'ai supprimé le Switch car il n'est pas utile ici. Voir quand c'est utile aquí .

0 votes

Merci ! Je l'emballe comme ça : <Layout><Switch><Route/></Switch></Layout> Cela a marché pour moi :)

3 votes

Aucun problème. Si vous utilisez un seul Route vous n'avez PAS besoin Switch . Switch est comme l'opérateur || : le premier Route à l'intérieur d'un Switch que le chemin de correspondance est rendu mais que l'autre Route à l'intérieur de la Switch ne sont PAS rendus. J'ai ajouté un lien vers la doc de Switch dans mon commentaire.

1 votes

Merci, c'est très utile.

10voto

CESCO Points 3210

Vous devez utiliser le composant switch pour que l'imbrication fonctionne bien. Aussi, voyez ceci question

// main app
<div>
    // not setting a path prop, makes this always render
    <Route component={AppShell}/>
    <Switch>
        <Route exact path="/" component={Login}/>
        <Route path="/dashboard" component={AsyncDashboard(userAgent)}/>
        <Route component={NoMatch}/>
    </Switch>
</div>

Et les composants de la version 4 ne prennent pas d'enfants, à la place, vous devez utiliser le render prop.

<Router>
    <Route render={(props)=>{
      return <div>Whatever</div>}>
    </Route>
  </Router>

5voto

marrekk Points 64

Essayez :

<Router>
    <Layout>
        <Route path='/abc' component={ABC} />
        <Route path='/xyz' component={XYZ} />
    </Layout>
</Router>

3 votes

Lorsque vous ajoutez la réponse, ajoutez une explication pour qu'elle soit utile aux autres. Cependant, +1 pour avoir répondu en premier

0 votes

Ce commentaire n'est pas utile. Donner un exemple n'est pas toujours utile.

0 votes

Cela semble fonctionner avec BrowserRouter au lieu de Router aussi.

2voto

Avare Kodcu Points 157

Si vous ne voulez pas Layout à exécuter en charge. Utilisez cette méthode :

<div className="container">
    <Route path="/main" component={ChatList}/>
    <Switch>
        <Route exact path="/" component={Start} />
        <Route path="/main/single" component={SingleChat} />
        <Route path="/main/group" component={GroupChat} />
        <Route path="/login" component={Login} />
    </Switch>
</div>

Chaque fois que l'histoire change, composantWillReceiveProps dans la ChatList s'exécutera.

0voto

Mohamed Yahya Points 21

Vous pouvez également essayer ceci :

<Route exact path="/Home"
                 render={props=>(
                                 <div>
                                      <Layout/>
                                      <Archive/>
                                </div>
                       )} 
    />

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X