Switch
только допустимые дочерние компоненты: Route
и Redirect
, поэтому, даже если другой реагирующий компонент отображает Route
, он не будет работать точно так же.
Смена дочерних элементов
Все дочерние элементы <Switch>
должны быть <Route>
или <Redirect>
элементами. Будет обработан только первый дочерний элемент, соответствующий текущему местоположению.
Редактировать
В то время как обернутые Route
компоненты могут по-прежнему отображать , как потомки "внуков" , кажется, что реквизиты маршрута применяются только на уровне root Switch
.
В следующих Switch
, даже если RouteWithSubRoutes
указывает exact
prop, RouteWithSubRoutes
в реагирующем DOM не , поэтому возвращается только первый элемент (по совпадению с домашним "/" маршрутом).
<Switch>
{routes.map(route => (
<RouteWithSubRoutes key={route.path} {...route} />
))}
</Switch>
Это следующее Switch
идентично вышеуказанному, за исключением указания exact
prop, и это работает, как и ожидалось.
<Switch>
{routes.map(route => (
<RouteWithSubRoutes key={route.path} exact {...route} />
))}
</Switch>
/ Edit
Звучит как у вас есть вопрос, состоящий из двух частей, почему оба разрешения работают.
Первая попытка исправить путем рендеринга Route
напрямую увенчается указанием реквизита exact
на всех маршрутах в Switch
, который только соответствует и отображает первый соответствующий Route
или Redirect
. Когда путь равен точно"/", то этот компонент рендерится, а когда он равен точно"/ tacos", тогда этот компонент рендерит.
Вторая попытка рендеринга все маршруты прямо в Router
, который соответствует и отображает все соответствующие маршруты, но, так как вы снова указываете exact
prop, он соответствует одному маршруту и работает.
Демо
![Edit react-router-dom Switch vs No Switch](https://codesandbox.io/static/img/play-codesandbox.svg)