React Router Switch и точный путь

Я прочитал этот документ о Коммутатор реагировать-маршрутизатор

Я понимаю определение Switch и Route

Но все еще не мог понять некоторые моменты

Если я хочу выбрать только один маршрут для рендеринга, мы используем Switch, как это

<Switch>
  <Route exact path = "/" component = {Home} />
  <Route path = "/a" component = {A} />
  <Route path = "/b" component = {B} />
</Switch>

Я не могу понять, что я могу получить тот же эффект без Switch.

 <Route exact path = "/" component = {Home} />
 <Route path = "/a" component = {A} />
 <Route path = "/b" component = {B} />

Так почему мы используем Switch? Когда нам нужно использовать Switch?


Я обнаружил ситуацию, когда нужно использовать Switch

Если я хочу отобразить конкретный компонент, когда путь не совпадает

нам нужно обернуть Route в Switch вот так

<Switch>
  <Route exact path = "/" component = {Home} />
  <Route path = "/a" component = {A} />
  <Route path = "/b" component = {B} />
  <Route component = {SpecificComponent} />
</Switch>

Я прав ?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
11
0
8 941
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Хотя в вашем случае вы можете получить тот же эффект, используя точное, но это может быть не всегда так. Однако в случаях, когда один из ваших маршрутов содержит вложенный маршрут, если у вас есть точный маршрут на верхнем уровне, вы не можете использовать вложенные маршруты.

Switch в приведенном выше случае служит этой цели, поскольку отображает только первое совпадение

Например,

Скажем, Домашний маршрут содержит вложенные маршруты, например

const Home = (props) => (
     <div>
          <Route path = "/dashboard" component = {Dashboard}/>
          <Route path = "/layout" component = {Layout}/>
     </div>
)

Итак, теперь, если вы напишете

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

и когда вы посещаете /dashboard. Этот компонент Dashboard не может быть визуализирован, поскольку ни один маршрут не совпадает с /dashboard на верхнем уровне.

Чтобы пример работал правильно, вы можете использовать Switch и переупорядочить маршруты так, чтобы пути, которые являются префиксами к другим путям, находились в конце.

<Switch>
  <Route path = "/a" component = {A} />
  <Route path = "/b" component = {B} />
  <Route path = "/" component = {Home} />
</Switch>

Спасибо за Ваш ответ. Но я все еще не могу понять ваш пример, поэтому, если мы хотим, чтобы пример работал правильно, нам нужно обернуть Route в Switch?

Anymore 22.08.2018 09:38

Я обнаружил ситуацию, когда нужно использовать переключатель. Я обновляю свой вопрос, я прав?

Anymore 22.08.2018 11:36

@ Anymore, да, это еще одна ситуация, в которой вы бы использовали переключатель, когда вы хотите отобразить маршрут по умолчанию, когда ничего не совпадает

Shubham Khatri 22.08.2018 11:37

Мой ответ указывает на ситуацию, когда вам нужно написать вложенные маршруты.

Shubham Khatri 22.08.2018 11:37

Спасибо!. Я хочу знать, как правильно запустить ваш пример, вы можете это объяснить?

Anymore 22.08.2018 11:56

@Anymore Обновил мой ответ

Shubham Khatri 22.08.2018 12:00

@Больше. Предположим, у вас есть маршрут с именем /a, а внутри компонента A есть дочерние компоненты с маршрутами /a/aa и /a/ab. Использование <Route exact path='/a' /> не позволит вам получить доступ к маршрутам /a/aa и /a/ab. Для этого вам нужно обернуть свой маршрут /a внутри Switch.

prak 13.12.2019 11:38

По сути, ключевое слово «точное» служит одной и той же цели. (ПРИМЕЧАНИЕ: алгоритм сопоставления, который использует проверки, чтобы увидеть, начинается ли текущий URL с этого пути.) Но пока мы используем, порядок объявления маршрута или специфичности имеет значение. Более конкретный маршрут нужно добавить вверху. В твоем случае

<Switch>
<Route path = "/a" component = {A} />
<Route path = "/b" component = {B} />
<Route exact path = "/" component = {Home} />
</Switch>

В случае «точного», когда вы передаете «точный», этот маршрут будет соответствовать только в том случае, если путь совпадает точно. В вашем случае домашний путь установлен на точное.

<Route exact path = "/" component = {Home} />
<Route path = "/a" component = {A} />
<Route path = "/b" component = {B} />

Позвольте мне описать отличительные особенности Route, exact и Switch:

  • Route выполняет частичное сопоставление. Путь маршрута совпадает включительно (совпадает со многими).

  • exact удаляет частичное совпадение. Он может соответствовать нескольким маршрутам, если мы используем в маршрутах подстановочные знаки.

  • Switch отображает только первый совпадающий маршрут. Путь Switch совпадает исключительно (соответствует только одному).

Чтобы объяснить подробно, я хочу проиллюстрировать, как работает сопоставление маршрутов с exact и без него. Предположим, у нас есть приведенный ниже код, и мы не используем exact.

how-route-matches-without-exact

Итак, если мы посетим URL-адрес /pagetwo, Route выполнит частичное сопоставление и отобразит оба маршрута. Посмотрим, как это будет происходить. На приведенной ниже иллюстрации мы смотрим на адресную строку и путь, по которому мы идем (извлеченный путь), а также на какой маршрут (-ы) выполняется (-ые) сопоставление. Итак, Route будет отображать маршрут, когда extractedPath.contains(path-in-our-Route-declaration) оценивается как истинное.

how-path-gets-matched-1

how-path-gets-matched-2

Надеюсь, это прояснит, как Route работает за сценой. Чтобы избежать этого частичного совпадения, мы используем exact. Использование exact решает проблему до тех пор, пока мы не столкнемся с некоторыми частными случаями. Предположим, у нас есть два маршрута вроде:

  • /users/create
  • /users/* (подстановочный знак в маршруте).

В приведенном выше случае exact будет соответствовать обоим маршрутам. Итак, для решения таких проблем мы можем использовать Switch. Он отображает только один маршрут и любой маршрут, который будет сопоставлен первым. Итак, здесь порядок, в котором вы определяете свои маршруты, имеет значение.

Другие вопросы по теме