Вот хорошая (немного старая) статья, в которой обсуждается состояние инициализации с помощью реквизита:
https://medium.com/@justintulk/react-anti-patterns-props-in-initial-state-28687846cc2e
Документы React называют это анти-паттерном:
«Использование реквизитов для генерации состояния в getInitialState часто приводит к дублированию« источника правды », то есть того, где находятся реальные данные. Это потому, что getInitialState вызывается только при первом создании компонента.»
Из документов, есть исключение:
"Используйте этот шаблон только в том случае, если вы намеренно хотите игнорировать обновления проп. В этом случае имеет смысл переименовать проп, чтобы он назывался initialColor или defaultColor. Вы можетезатем вынудите компонент «сбросить» свое внутреннее состояние, изменив ключ, когда это необходимо. "
При этом я также время от времени обнаруживаю, что делаю это.
Примером, где я нахожу это полезным, являются компоненты, которые позволяют пользователям редактировать сложное состояние. Вы можете инициализировать состояние с помощью реквизита, и компонент внутренне обрабатывает изменения в этом состоянии. Если вы хотите сбросить состояние при смене реквизита, у вас есть два варианта:
Первый - прослушать изменения и вызвать setState, например:
componentDidUpdate(prevProps, prevState) {
if (prevProps.inputValue !== this.props.inputValue) {
this.setState({ inputVal: this.props.inputValue })
}
}
Рекомендуемый вариант - датькомпонент ключ, который зависит от реквизита, который должен вызвать сброс. Затем при изменении реквизита состояние компонента будет повторно инициализировано:
<MyComponent initProp={someValue} key={`key_${someValue}`/>
Я бы порекомендовал эти опции только для сложного состояния. В большинстве примеров родительский компонент может содержать это состояние, а внутренний компонент может использовать обратный вызов для обновления родительского элемента изменениями.