Реквизит против государства сводится к тому, «кому принадлежат эти данные?»
Если данные управляются одним компонентом, но другой компонент нуждается в доступе к этим данным, вы должны передавать данные от одного компонента другому компоненту через реквизиты.
Если компонент управляет данными сам, он должен использовать состояние и setState
для управления им.
Таким образом, ответ на
как я могу обновить компонент сам по себе, а не от родительского компонента? следует ли использовать реквизит или состояние в этом случае?
предназначено для использования.
Реквизит следует считать неизменным и должен никогда не быть изменен с помощью мутации. setProps
полезен только для компонента верхнего уровня и вообще не должен использоваться вообще. Если компонент передает другому компоненту свойство, а первый компонент хочет, чтобы второй мог его изменить, он должен также передать ему свойство функции, которое второй компонент может вызвать, чтобы попросить первый компонент обновить его состояние. Например:
var ComponentA = React.createClass({
getInitialState: function() {
return { count: 0 };
},
render: function() {
return <Clicker count={this.state.count} incrementCount={this.increment} />;
},
increment: function() {
this.setState({count: this.state.count + 1});
}
});
// Notice that Clicker is stateless! It's only job is to
// (1) render its `count` prop, and (2) call its
// `incrementCount` prop when the button is clicked.
var Clicker = React.createClass({
render: function() {
// clicker knows nothing about *how* to update the count
// only that it got passed a function that will do it for it
return (
<div>
Count: {this.props.count}
<button onClick={this.props.incrementCount}>+1</button>
</div>
);
}
});
(Рабочий пример: https://jsbin.com/rakate/edit?html,js,output)
Для и объектно-ориентированного программирования аналогия, думать класс/объект: состояние бы свойство вы положили на классе; класс может обновлять их по своему усмотрению. Реквизиты будут похожи на аргументы методов; вы никогда не должны мутировать аргументы, переданные вам.
Сохраняя компонент «без гражданства» означает, что он не имеет ни одно государство, и все его рендеринг основывается на его реквизита. Конечно, должно быть состояние где-то, иначе ваше приложение ничего не сделает! Таким образом, это руководство в основном говорит, чтобы поддерживать как можно больше компонентов без гражданства и управлять состоянием всего лишь в нескольких компонентах верхнего уровня.
Хранение компонентов без гражданства облегчает их понимание, повторное использование и тестирование.
См. A brief interlude: props vs state в документах React для получения дополнительной информации.
Неправильное использование. Компонент повторно отображается, когда изменяется его состояние или реквизит. –