Особенность Router заключается в том, что, если у вас нет Switch, он будет отображать все маршруты, которые являются префиксами для соответствующего Route.В вашем случае "/shop/:itemId"
будет соответствовать как "/shop/:itemId"
, так и *
, и, следовательно, будет отображаться компонент Error.
Также из v4 или Router вам необходимо иметь вложенные Routes внутри самих компонентов.Также вам необходимо принять решение о том, является ли itemId действительным или нет в компоненте ItemDetails, а затем перенаправить на страницу 404, если она не
<Router>
<div className="App">
<Nav />
<Switch>
<Route path="/" exact component={Main} />
<Route path="/about" exact component={About} />
<Route path="/contact" exact component={Contact} />
<Route path="/shop" exact component={Shop} />
<Route component={Error404} />
</Switch>
</div>
</Router>
, а в компоненте Shop у вас будет
render() {
return (
<div>
{/* other elements */ }
<Route path="/shop/:itemId" exact component={ItemDetails} />
</div>
)
}
и в компоненте ItemDetails
render() {
if(!isValid(this.props.match.params.itemId)) {
return <Redirect to="/404" />
}
return (
<>{/* ItemDetails component code */}</>
)
}