Reaguj: różnica między <Route dokładna ścieżka = „/” /> i <Route path = „/” />

162

Czy ktoś może wyjaśnić różnicę między

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

i

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

Nie znam znaczenia słowa „dokładny”

bat
źródło
1
Wszystkie odpowiedzi są świetne. Jednak może pojawić się wątpliwość typu „Dlaczego nie możemy mieć <code> dokładnego </code> dla wszystkich tras?” Wyobraź sobie adres URL podobny do tego. <code> twojareactwebsite.com/getUsers/userId= ? </code> To jest przykład, w którym identyfikator użytkownika zostanie dynamicznie wprowadzony do adresu URL, więc nie możemy tutaj użyć właściwości <code> exact </code> w routerze.
VIJAYKUMAR REDDY ALAVALA

Odpowiedzi:

264

W tym przykładzie nic tak naprawdę. Parametr exactpojawia się, gdy masz wiele ścieżek o podobnych nazwach:

Na przykład wyobraź sobie, że mamy Userskomponent, który wyświetla listę użytkowników. Mamy też CreateUserkomponent służący do tworzenia użytkowników. Adres URL CreateUserspowinien być zagnieżdżony w Users. Więc nasza konfiguracja może wyglądać mniej więcej tak:

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

Teraz problem tutaj, kiedy przejdziemy do http://app.com/usersroutera, przejdzie przez wszystkie zdefiniowane przez nas trasy i zwróci PIERWSZE znalezione dopasowanie. W tym przypadku najpierw znajdzie Userstrasę, a następnie ją zwróci. Wszystko dobrze.

Ale gdybyśmy poszli do http://app.com/users/create, ponownie przeszedłby przez wszystkie nasze zdefiniowane trasy i zwrócił PIERWSZE znalezione dopasowanie. Router React wykonuje częściowe dopasowanie, więc /usersczęściowo pasuje /users/create, więc ponownie niepoprawnie zwróci Userstrasę!

Parametr exactwyłącza częściowe dopasowanie dla trasy i zapewnia, że ​​zwraca trasę tylko wtedy, gdy ścieżka jest DOKŁADNIE dopasowana do bieżącego adresu URL.

Więc w tym przypadku powinniśmy dodać exactdo naszej Userstrasy, aby pasowała tylko na /users:

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

Dokumenty exactszczegółowo wyjaśniają i podają inne przykłady.

Chase DeAnda
źródło
11
„Ale gdybyśmy przeszli do app.com/users/create , ponownie przeszedłby przez wszystkie zdefiniowane przez nas trasy i zwrócił PIERWSZE znalezione dopasowanie”. - w rzeczywistości zwróci wszystkie trasy, dla których znalazł dopasowanie (pełne lub częściowe). Zachowanie opisane przez @Chase DeAnda będzie miało miejsce tylko wtedy, gdy trasy <Route> są otoczone znacznikiem <Switch>.
watsabitz,
4
exactpowinno być moim zdaniem domyślne
Alexander Derck
A co jeśli mamy każdą definicję trasy w różnych komponentach, to znaczy /admin//usersw komponencie Admin i /admin/users/createkomponencie Root ??? Obecnie mam taką sytuację i typowe exactrozwiązanie nie działa poprawnie.
Yulio Aleman Jimenez
Myślę, że to zachowanie działa tylko wtedy, gdy obie trasy są na tym samym poziomie swojego rodzica Switcha (lub komponentu)
Yulio Aleman Jimenez
1
@ChaseDeAnda to, czego potrzebuję, jest dokładnie odwrotne. Może powinienem napisać nową odpowiedź na SO, aby wyjaśnić moją sytuację i uzyskać prawidłowe odpowiedzi.
Yulio Aleman Jimenez
7

Krótko mówiąc, jeśli masz wiele tras zdefiniowanych dla routingu aplikacji, otoczonych Switchtakim komponentem;

<Switch>

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

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

</Switch>

Następnie musisz umieścić exactsłowo kluczowe w Trasie, której ścieżka jest również zawarta w innej ścieżce. Na przykład ścieżka główna /jest zawarta we wszystkich ścieżkach, więc musi mieć exactsłowo kluczowe, aby odróżnić ją od innych ścieżek, które zaczynają się od /. Powód jest również podobny do /functionsścieżki. Jeśli chcesz użyć innej ścieżki, takiej jak /functions-detaillub /functions/open-doorktóra /functionsw niej zawiera , musisz użyć exactdla /functionstrasy.

milkersarac
źródło
-1

Najkrótsza odpowiedź brzmi

Spróbuj tego.

<switch>
   <Route exact path="/" component={Home} />
   <Route path="/about" component={About} />
   <Route path="/shop" component={Shop} />
 </switch>
Jamal Sheikh Ali
źródło
1
W zasadzie nie wyjaśnia to znaczenia exactatrybutu / właściwości, a zatem z pewnością nie jest „odpowiedzią”. Powinieneś raczej spróbować odpowiedzieć na pytanie, które jest faktycznie zadawane, zamiast dawać rozwiązanie problemu, którego nie jesteś pewien, czy OP faktycznie ma.
Victor Zamanian,