Pull to refresh

Comments 8

Не получается придумать ситуацию, при которой было бы нужно обновлять состояние на основе предыдущих значений props. Есть примерчик?
На мой взгляд withStateMaster был бы удобнее декоратором
withStateMaster(PROP_LIST, INITIAL_STATE)(ContainerComponent)
Появляется шикарная возможность использовать ES7 синтаксис
Ну вот, например, у меня есть компонент Select, я хочу, чтобы он мог принимать вместо опций промис, тогда мне нужно будет хранить опции в состоянии, то есть подождать исполнения промиса и обновить состояние, которое будет содержать новый массив опций, ясно понятно, что реакт разработчики рекомендуют использовать полностью controlled или полностью uncontrolled компоненты, но не знаю, иногда нужно что-то записывать в состояние и не всегда мемоизация решит эту проблему. Спасибо за совет с декоратором, я попытаюсь это реализовать)
Думаю, разрешению промисов место в componentDidMount и componentDidUpdate. Они отлично для этого подходят. Последний принимает prevProps, и в обоих доступен контекст.

Пример: нужно изменить значение атрибута в 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, происходит рендер его родителя. Покажите, пожалуйста, пример решения моей задачи вашим способом.

Я пока не использовал getDerivedStateFromProps(), но в componentWillReceiveProps() использую только nextProps. Да, первого рендера не избежать в любом случае — для минимизации его я делаю так:
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 они никак не зависят

Sign up to leave a comment.

Articles