Причина получения бесконечного цикла
Вы получаете бесконечный цикл, потому что componentWillReceiveProps
вызывает всякий раз, когда изменяется реквизит, следовательно, при такой функции, если вы пишете эту строку this.props.getUserById(this.props.match.params.id)
, она выбирает информацию старого пользователя (скажем, пользователя A), потому что this.props
относится к старые реквизиты, в то время как nextProps
относится к новым (скажем, пользователю B), следовательно, вы снова пользователь A. В этот момент nextProps ссылается на пользователя A, в то время как this.props ссылается на пользователя B. Итак, реквизиты изменяются, это затем снова выбирает пользователя B, и вы получаете бесконечный цикл.
Решение
Выбирать пользователя только в том случае, если оба идентификатора различны и пользователь nextProps.props.match.params.id
вместо this.props
.
if (nextProps.match.params.id !== this.props.match.params.id) {
this.props.getUserById(nextProps.props.match.params.id);
}
Улучшения
Я рекомендовал вам использовать хуки вместо компонентов на основе классов для всех новых компонентов, которые вы делаете. Это делает вещи проще. См. Документацию для ловушки useEffect, в ней вы упомянете аргументы, которые выбирают пользователя только в случае изменений пользователя. так что только одна вещь сделает работу за componentDidMount
и ComponentWillReceiveProps