Réagir: différence entre <Route exact path = "/" /> et <Route path = "/" />

163

Quelqu'un peut-il expliquer la différence entre

<Route exact path="/" component={Home} />

et

<Route path="/" component={Home} />

Je ne connais pas le sens de 'exact'

batt
la source
1
Les réponses sont toutes excellentes. Cependant, on peut avoir un doute comme "Pourquoi ne pouvons-nous pas avoir <code> exact </code> pour toutes les routes alors?" Imaginez une URL qui ressemble à quelque chose comme ça. <code> yourreactwebsite.com/getUsers/userId= ? </code> Ceci est un exemple où l'ID de l'utilisateur sera dynamiquement alimenté dans l'URL et nous ne pouvons donc pas utiliser l'accessoire <code> exact </code> dans votre routeur ici.
VIJAYKUMAR REDDY ALAVALA

Réponses:

266

Dans cet exemple, rien de vraiment. Le exactparamètre entre en jeu lorsque vous avez plusieurs chemins qui ont des noms similaires:

Par exemple, imaginons que nous ayons un Userscomposant qui affiche une liste d'utilisateurs. Nous avons également un CreateUsercomposant utilisé pour créer des utilisateurs. L'URL de CreateUsersdoit être imbriquée sous Users. Notre configuration pourrait donc ressembler à ceci:

<Switch>
  <Route path="/users" component={Users} />
  <Route path="/users/create" component={CreateUser} />
</Switch>

Maintenant, le problème ici, lorsque nous allons au http://app.com/usersrouteur, passera par toutes nos routes définies et retournera la PREMIÈRE correspondance qu'il trouve. Donc, dans ce cas, il trouverait d'abord l' Usersitinéraire, puis le renverrait. Tout bon.

Mais, si nous y allions http://app.com/users/create, il passerait à nouveau par toutes nos routes définies et retournerait la PREMIÈRE correspondance qu'il trouve. Le routeur React effectue une correspondance partielle, donc une correspondance /userspartielle /users/create, de sorte qu'il renvoie Usersà nouveau incorrectement la route!

Le exactparamètre désactive la correspondance partielle pour une route et s'assure qu'elle ne renvoie la route que si le chemin correspond exactement à l'URL actuelle.

Donc, dans ce cas, nous devrions ajouter exactà notre Usersroute pour qu'elle ne corresponde que sur /users:

<Switch>
  <Route exact path="/users" component={Users} />
  <Route path="/users/create" component={CreateUser} />
</Switch>

Les documents expliquent exacten détail et donnent d'autres exemples.

Chase DeAnda
la source
11
"Mais, si nous allions à app.com/users/create , il passerait à nouveau par toutes nos routes définies et renverrait la PREMIÈRE correspondance trouvée." - en fait, il retournera toutes les Routes pour lesquelles il a trouvé une correspondance (complète ou partielle). Le comportement décrit par @Chase DeAnda ne se produira que si les <Route> sont entourés d'une balise <Switch>.
watsabitz
4
exactdevrait être la valeur par défaut à mon avis
Alexander Derck
Et si nous avons chaque définition de route dans différents composants, je veux dire /admin//usersdans le composant Admin, et /admin/users/createdans le composant Root ??? Je suis actuellement dans cette situation et la exactsolution typique ne fonctionne pas correctement.
Yulio Aleman Jimenez
Je pense que ce comportement ne fonctionne que si les deux routes sont au même niveau de son parent Switch (ou composant)
Yulio Aleman Jimenez
1
@ChaseDeAnda ce dont j'ai besoin est exactement le contraire. Peut-être que je devrais écrire une nouvelle réponse sur SO pour clarifier ma situation et obtenir les bonnes réponses.
Yulio Aleman Jimenez
7

En bref, si vous avez plusieurs itinéraires définis pour le routage de votre application, inclus avec un Switchcomposant comme celui-ci;

<Switch>

  <Route exact path="/" component={Home} />
  <Route path="/detail" component={Detail} />

  <Route exact path="/functions" component={Functions} />
  <Route path="/functions/:functionName" component={FunctionDetails} />

</Switch>

Ensuite, vous devez mettre le exactmot-clé de la Route dont le chemin est également inclus par le chemin d'une autre Route. Par exemple, le chemin d'accueil /est inclus dans tous les chemins, il doit donc avoir un exactmot - clé pour le différencier des autres chemins commençant par /. La raison est également similaire au /functionschemin. Si vous souhaitez utiliser un autre chemin de route comme /functions-detailou /functions/open-doorqui comprend, /functionsvous devez l'utiliser exactpour la /functionsroute.

Milkersarac
la source
-1

La réponse la plus courte est

Veuillez essayer ceci.

<switch>
   <Route exact path="/" component={Home} />
   <Route path="/about" component={About} />
   <Route path="/shop" component={Shop} />
 </switch>
Jamal Sheikh Ali
la source
1
Cela ne fait fondamentalement rien pour expliquer la signification de l' exactattribut / accessoire, et n'est donc certainement pas une "réponse". Vous devriez essayer de répondre à la question qui vous est réellement posée plutôt que de donner une solution à un problème dont vous n'êtes pas sûr qu'OP ait réellement.
Victor Zamanian le