Зачем использовать getDerivedStateFromProps вместо componentDidUpdate?
Как говорится в этом деле React Github, я все больше вижу, что
стоимость render()
относительно небольшая
В React 16.3 мне интересно, почему можно использовать новые getDerivedStateFromProps вместо componentDidUpdate?
Представьте себе этот пример:
getDerivedStateFromProps(nextProps, prevState) {
if (!prevState.isModalOpen && nextProps.isReady) {
return { isModalOpen: true };
}
}
против
componentDidUpdate(prevProps, prevState) {
if (!prevState.isModalOpen && this.props.isReady) {
this.setState({ isModalOpen: true });
}
}
Позднее кажется проще, потому что он использует только существующий API и выглядит так же, как то, что мы делали в компонентах componentWillReceiveProps, поэтому я не понимаю, почему пользователи будут искать getDerivedStateFromProps? Какая польза?
Спасибо!
Ответы
Ответ 1
Так что Дэн Абрамов ответил на Твиттер, и кажется, что есть две причины, почему вы должны использовать getDerivedStateFromProps
вместо componentDidUpdate
+ setState
:
setState в компонентеDidUpdate вызывает дополнительный рендеринг (не воспринимается напрямую для пользователя, но замедляет ваше приложение). И вы производите метод can not, чтобы состояние было готово (потому что оно не будет в первый раз).
- Причина исполнения: она позволяет избежать ненужной повторной обработки.
- Поскольку
getDerivedStateFromProps
вызывается перед рендерингом в init, вы можете инициализировать свое состояние в этой функции вместо того, чтобы иметь конструктор для этого. В настоящее время у вас должен быть конструктор или componentWillMount
для инициализации вашего состояния до первоначального рендеринга.
Ответ 2
getDerivedStateFromProps
фактически заменяет componentWillReceiveProps
а componentDidMount
не будет устаревшим.
Я почти уверен, что именно сообщество решило создать статический метод с этим именем.
Причиной этого изменения является то, что componentWillReceiveProps
был одним из методов, который привел к путанице и дальнейшим утечкам памяти в пользовательских приложениях:
Многие из этих проблем усугубляются подмножеством жизненных циклов компонента (componentWillMount, componentWillReceiveProps и componentWillUpdate). Они также являются жизненными циклами, которые вызывают наибольшую путаницу в сообществе React. По этим причинам мы будем осуждать эти методы в пользу лучших альтернатив.
Здесь твит Дэн Абрамов, который также делает это более ясным:
Однако это означает, что мы хорошо разделяем наши пути с компонентомWillReceiveProps() в 17. Мы считаем, что getDerivedStateFromProps() делает ту же работу лучше и менее запутанной. Также случается, что cWRP() действительно испортит наши планы по извлечению данных, которые могут быть в конвейере. 🙂