Реагуйте: різниця між <Точний шлях маршруту = "/" /> та <Шлях маршруту = "/" />


162

Може хтось пояснить різницю між

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

і

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

Я не знаю значення "точного"


1
Відповіді всі чудові. Однак у когось може виникнути сумніви на кшталт "Чому тоді ми не можемо мати <code> точно </code> для всіх маршрутів?" Уявіть URL-адресу, яка є приблизно такою. <code> yourreactwebsite.com/getUsers/userId= ? </code> Це приклад, коли ідентифікатор користувача динамічно подаватиметься в URL-адресі, і тому ми не можемо перейти з підтримкою <code> точно </code> у ваш маршрутизатор.
VIJAYKUMAR REDDY ALAVALA

Відповіді:


264

У цьому прикладі насправді нічого. exactПари вступають в гру , коли у вас є кілька шляхів , які мають схожі назви:

Наприклад, уявіть, у нас був Usersкомпонент, який відображав список користувачів. У нас також є CreateUserкомпонент, який використовується для створення користувачів. URL-адреса CreateUsersмає бути вкладено під Users. Отже, наша установка може виглядати приблизно так:

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

Тепер проблема тут, коли ми переходимо до http://app.com/usersмаршрутизатора, пройдемо всі наші визначені маршрути і повернемо ПЕРШЕ відповідність, яку він знайде. Тож у цьому випадку він Usersспочатку знайде маршрут, а потім поверне його. Все добре.

Але, якби ми пішли http://app.com/users/create, вона знову пройде всі наші визначені маршрути та поверне ПЕРШУ відповідність, яку вона знайде. Маршрутизатор React робить часткове узгодження, тому /usersчастково збігається /users/create, тому він неправильно поверне Usersмаршрут знову!

Параметр exactвимикає часткове узгодження для маршруту та гарантує, що він повертає маршрут лише у тому випадку, коли шлях відповідає ТОЧНОМУ поточній URL-адресі.

Тож у цьому випадку ми повинні додати exactдо нашого Usersмаршруту, щоб він відповідав лише /users:

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

Документи exactдетально пояснюють та наводять інші приклади.


11
"Але якщо ми перейшли до app.com/users/create , він знову пройде всі наші визначені маршрути та поверне ПЕРШИЙ відповідність, яку він знайде." - насправді він поверне всі маршрути, за які знайшов відповідність (повну або часткову). Поведінка, описана @Chase DeAnda, відбуватиметься лише в тому випадку, якщо <Route> s укладений тегом <Switch>.
watsabitz

4
exactповинен бути дефолтом на мою думку
Олександр Дерк

А як бути, якщо у нас є кожне визначення маршруту в різних компонентах, я маю /admin//usersна увазі в компоненті адміністратора та /admin/users/createв компоненті Root ??? Наразі у мене така ситуація, і типове exactрішення не працює належним чином.
Юліо Алеман Хіменес

Я думаю, що така поведінка працює лише в тому випадку, якщо обидва маршрути перебувають на одному рівні батьківського перемикача (або його компонента)
Юліо Алеман Хіменес

1
@ChaseDeAnda те, що мені потрібно, якраз навпаки. Можливо, я повинен написати нову відповідь на ТА, щоб прояснити свою ситуацію та отримати відповіді належним чином.
Юліо Алеман Хіменес

7

Якщо коротко, якщо для маршрутизації вашого додатка визначено декілька маршрутів, додані до цього Switchкомпонента;

<Switch>

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

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

</Switch>

Потім ви повинні ввести exactключове слово до маршруту, шлях якого також включений в інший шлях маршруту. Наприклад, домашній шлях /включений у всі шляхи, тому для його exactрозмежування необхідно мати ключове слово, щоб відрізняти його від інших шляхів, з яких починається /. Причина також схожа на /functionsшлях. Якщо ви хочете використовувати інший маршрут, який подобається /functions-detailабо /functions/open-doorякий включає /functionsв нього, вам потрібно скористатися exactдля /functionsмаршруту.



-1

Найкоротша відповідь - це

Спробуйте це.

<switch>
   <Route exact path="/" component={Home} />
   <Route path="/about" component={About} />
   <Route path="/shop" component={Shop} />
 </switch>

1
Це в основному нічого не пояснює значення exactатрибута / опори, і, отже, це, безумовно, не є "відповіддю". Вам слід спробувати вирішити запитання, яке насправді задають, а не давати рішення проблеми, для якої ви не впевнені, що ОП насправді має.
Віктор Заманян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.