Реагирование рендеринга с состоянием или реквизитом
Я хотел бы знать разницу между компонентом рендеринга с состоянием или реквизитом напрямую.
getInitialState:
data: this.props.data
Следующий код для функции рендера
1.
data = this.state.data
return (<Component data={data} />)
2.
return (<Component data={this.state.data} />)
3.
return (<Component data={this.props.data} />)
Первые две ситуации дают сбой, когда я использую setState при прослушивании действия рефлюкса. Если у кого-то есть рекомендации по использованию, отличные от setState, или скажите мне, что разница в этих трех фрагментах кода будет очень цениться.
2 ответа
Положить реквизит в таком состоянии:
getInitialState: function () {
return {
someKey: this.props.someKey
};
}
является анти-паттерном, если вы не собираетесь изменять значение someKey
позже, и вы используете опору как начальное значение.
Так что, если вы не измените значение пропущенной опоры, вы должны пойти с номером три.
Разница в том, что компонент, который не имеет состояния, может считаться "чистым" (одни и те же пропускаемые данные дают одинаковый результат каждый раз), и эти компоненты почти всегда легче рассуждать. Дублирование опоры в состоянии без изменения состояния просто дает вам больше строк кода в компоненте, и это может запутать кого-то еще, читающего код. Это чистый компонент, замаскированный под нечистый компонент.
Еще немного о реквизите и состоянии. Реквизит и состояние связаны между собой. Состояние одного компонента часто становится опорой дочернего компонента. Реквизиты передаются дочернему элементу в методе рендеринга родителя в качестве второго аргумента React.createElement() или, если вы используете JSX, более знакомых атрибутов тега.
<MyChild name={this.state.childsName} />
Значение родительского состояния childsName становится дочерним this.props.name. С точки зрения ребенка, имя опора является неизменным. Если это нужно изменить, родитель должен просто изменить свое внутреннее состояние:
this.setState({ childsName: 'New name' });
и Реакт распространит это для ребенка для вас. Естественный последующий вопрос: что, если ребенку нужно сменить опору? Обычно это делается через дочерние события и родительские обратные вызовы. Дочерний объект может представлять событие, называемое, например, onNameChanged. Затем родитель подписывается на событие, передавая обработчик обратного вызова.
<MyChild name={this.state.childsName} onNameChanged={this.handleName} />
Дочерний объект будет передавать запрашиваемое новое имя в качестве аргумента обратного вызова события, вызывая, например, this.props.onNameChanged('New name'), и родительский объект будет использовать имя в обработчике событий для обновления своего состояния.
handleName: function(newName) {
this.setState({ childsName: newName });
}