Похоже, что вы ищете Nested Routing
Внутри основного компонента коммутатор будет обеспечивать только представление посадки и каталога.
<Switch>
<Route path="/" exact component={Landing} />
<Route
path="/catalog/:category/:type?/:typeOption?"
component={Catalog}
/>
</Switch>
Сейчасдалее в представлении каталога вы можете вложить детали в что-то вроде:
function Catalog({ match }) {
return (
<div>
<Route
path={match.path + '/:nameOfProduct'}
component={DetailedView}
/>
<Route
exact
path={match.path}
render={() => <h3>Render the list of items here</h3>}
/>
</div>
)
}
Таким образом, URL-адрес изменяется на добавленный к тому, что было ранее.
Чтобы обработать необязательные параметры, вам придется как-то дифференцировать идентификатор для type
и product
.Например,Если у меня есть ограничение на то, что все идентификаторы продуктов начинаются с pr
, это будет выглядеть следующим образом:
<Switch>
<Route path={`${match.path}/:id(pr.*)`} render={() => <p>Product</p>} />
<Route path={match.path} render={() => <p>Still Catalogue</p>} />
</Switch>
Если вы не можете дифференцировать их с помощью шаблона регулярных выражений, то вам придется добавить параметр маршрутизации вURL, делающий это:
/catalog/mens/shirts/product/nameOfShirt
/catalog/mens/shirts/type/product/nameOfShirt
Таким образом, вы можете добавить Route
над значением для catalog
в операторе Switch