У меня есть эти маршруты
<Route exact path = {`/admin/caters/:id`} component = {Cater} />
<Route exact path = {'/admin/caters/create'} component = {CreateCater} />
Когда я перехожу к первому маршруту, я получаю услугу с заданным идентификатором. И компонент Cater отображается
Когда я перехожу ко второму маршруту, компонент CreateCater отображается на странице, но я заметил, что выполняются некоторые действия redux, которые используются в компоненте Cater. Итак, оба компонента каким-то образом отрисовываются, но я не могу понять почему.
Вот компоненты:
Cater:
class Cater extends Component {
async componentDidMount() {
console.info('Cater component did mount')
const { match: { params: { id }}} = this.props
this.props.get(id)
}
render() {
const { cater } = this.props
if (!cater) {
return null
}
else {
return (
<div>
... component data ...
</div>
)
}
}
}
const mapStateToProps = (state, props) => {
const { match: { params: { id }}} = props
return {
cater: caterSelectors.get(state, id)
}
}
const mapDispatchToProps = (dispatch, props) => {
return {
get: (id) => dispatch(caterActions.get(id))
}
}
export default connect(mapStateToProps, mapDispatchToProps)(Cater)
CreateCater:
export default class CreateCaterPage extends Component {
render() {
return (
<React.Fragment>
<Breadcrumbs />
<CaterForm />
</React.Fragment>
)
}
}
Когда я перехожу в / admin / caters / create ', я вижу console.info в методе жизненного цикла componentDidMount () внутри компонента Cater.
Не могу понять, что делаю не так :(
Спасибо за ответ @FrankerZ. Я попробовал, и это не имело никакого значения. Я попытался сделать URL-адреса другой длины, чтобы создание выглядело как /admin/cater/create/cater. И тогда у меня не было никаких проблем, но я хочу не так структурировать свой URL



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема в том, что :id совпадает с create (так что он думает, что «см. Службу с идентификатором create»). Чтобы решить эту проблему, нужно поместить маршрут сопоставления с подстановочными знаками последним и обернуть все <Routes/> в <Switch/>, чтобы он отображал только первое совпадение.
Если у вас есть вопросы, ознакомьтесь с документацией: https://reacttraining.com/react-router/core/api/Switch
/create соответствует /:id, поэтому логично, что этот маршрут совпадает. Я рекомендую заставить :id искать только числа:
<Route exact path = {`/admin/caters/:id(\\d+)`} component = {Cater} />
<Route exact path = {'/admin/caters/create'} component = {CreateCater} />
Точно так же вы можете следовать рекомендации @ jabsatz, использовать переключатель, и он будет соответствовать первому совпадающему маршруту. В этом случае вам необходимо убедиться, что маршрут /admin/caters/create является первым совпавшим элементом <Route />.
@David response-router под капотом использует путь к регулярному выражению. Они немного объясняют это в документации.
@FrankerZ, спасибо! Это исправило это для меня. Не знал и о (\\ d +).
Попробуйте поменять местами теги
<Route />(сначала поместите / создайте) и дайте мне знать, если это что-то изменит.