Comments 8
На мой взгляд withStateMaster был бы удобнее декоратором
withStateMaster(PROP_LIST, INITIAL_STATE)(ContainerComponent)
Появляется шикарная возможность использовать ES7 синтаксисПример: нужно изменить значение атрибута в state
, когда меняется значение определённого атрибута в props
. Так предлагают делать создатели React:
static getDerivedStateFromProps(props, state) {
if (props.type !== state.lastType) {
return {
lastType: props.type,
progress: 0 // Значение, которое должно обнуляться, когда изменяется props.type
};
} else {
return {};
}
}
Как решить эту задачу без использования предыдущего значения props.type
?
Можно использовать setState
внутри componentDidUpdate
, но тогда рендер будет происходить 2 раза (после получения новых props
и после вызова setState
).
но тогда рендер будет происходить 2 раза
shouldComponentUpdate()?..
Какой из 2-х рендеров вы предлагаете отменить? Если первый, то всё равно будет 2 рендера, потому что скорее всего, когда компонент получает новые props
, происходит рендер его родителя. Покажите, пожалуйста, пример решения моей задачи вашим способом.
render() {
if (!this.state.service) { return null }
return (...)
}
Далее для избежания ненужных рендеров:
shouldComponentUpdate(nextProps: ServiceModalProps) {
return (!nextProps.sid) ? false : true
}
Ни и промисы с обновлением состояния тоже только когда надо:
componentWillReceiveProps(nextProps: ServiceModalProps) {
if (nextProps.sid) {
this.getService()
}
}
Возможно что-то не учел (например, изменение this.props.sid, но проверку на это можно сделать также в shouldComponentUpdate()) или не допонял — не пинайте сильно…
Не хватает практического примера, где это может быть полезно.
В статье есть пример кода со здоровенным getDerivedStateFromProps
(чтобы показать всё многообразие API, вероятно), но из всех свойств в render используется только два, и от prevProps они никак не зависят
Решение отсутствия prevProps в getDerivedStateFromProps