React router v4 - рендеринг двух компонентов на одном маршруте

У меня есть эти маршруты

 <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.

Не могу понять, что делаю не так :(

Попробуйте поменять местами теги <Route /> (сначала поместите / создайте) и дайте мне знать, если это что-то изменит.

ugh StackExchange 08.11.2018 19:04

Спасибо за ответ @FrankerZ. Я попробовал, и это не имело никакого значения. Я попытался сделать URL-адреса другой длины, чтобы создание выглядело как /admin/cater/create/cater. И тогда у меня не было никаких проблем, но я хочу не так структурировать свой URL

Roi 08.11.2018 19:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
2 463
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема в том, что :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 под капотом использует путь к регулярному выражению. Они немного объясняют это в документации.

ugh StackExchange 08.11.2018 19:23

@FrankerZ, спасибо! Это исправило это для меня. Не знал и о (\\ d +).

Roi 08.11.2018 19:25

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