React router v4 - рендеринг двух компонентов на одном маршруте - PullRequest
0 голосов
/ 08 ноября 2018

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

 <Route exact path={`/admin/caters/:id`} component={Cater} />
 <Route exact path={'/admin/caters/create'} component={CreateCater} />

При переходе на первый маршрут я получаю катера с заданным идентификатором. И компонент Cater отображается

Когда я перехожу ко второму маршруту, на странице отображается компонент CreateCater, но я заметил, что выполняются некоторые избыточные действия, которые используются в компоненте Cater. Так что оба компонента как-то визуализируются - но я не могу понять, почему.

Вот компоненты:

Катер:

class Cater extends Component {

  async componentDidMount() {
        console.log('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.log в методе жизненного цикла componentenDidMount () внутри компонента Cater.

Я не могу понять, что я делаю неправильно: (

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

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

0 голосов
/ 08 ноября 2018

Проблема в том, что :id совпадает с create (поэтому он думает, что "см. Cater с id create"). Чтобы решить эту проблему, нужно поставить маршрут подстановочного знака последним и обернуть все <Routes/> <Switch/>, чтобы он отображал только первый удар.

Проверьте документы, если у вас есть еще вопросы: https://reacttraining.com/react-router/core/api/Switch

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...