考虑以下示例
class MyApp extends Component {
counter = 0;
state = {
counter: 0
};
incrementCounter() {
this.counter = this.counter + 1;
this.setState({
counter: this.state.counter + 1
});
}
render() {
return <div>
<p>{this.counter} and {this.state.counter}</p>
<button onClick={this.incrementCounter}>Increment</button>
</div>
}
}
当我单击按钮时,我看到this.counter和this.state.counter都显示了增加的值
我的问题是为什么我必须使用状态?尽管react能够重新呈现所有实例属性
counter = 0;
incrementCounter() {
this.counter = this.counter + 1;
this.setState({});
}
在上面的代码片段中,仅调用this.setState({})就可以了,那为什么我应该使用this.state属性存储组件状态?
答案 0 :(得分:7)
state
和instance properties
有不同的用途。虽然使用空参数调用setState将导致呈现并反映更新后的实例属性,但是state可以用于更多功能,例如
在shouldComponentUpdate中比较prevState
和currentState
以决定是否要渲染,或者在诸如componentDidUpdate之类的生命周期方法中比较,您可以在其中根据状态变化采取措施。
state是react用来满足特殊目的的特殊实例属性。同样在setState
中,出于性能原因而对状态更新进行批处理,并且状态更新异步发生,这与类变量更新是同步发生的不同。一个类变量将没有这些功能。
此外,当您向组件提供类变量作为支持时,除非您自己创建变量的新实例,否则在子组件的生命周期方法中无法区分此类变量的更改。 React已经为您提供了state
属性
答案 1 :(得分:4)
两者都有不同的目的。经验法则是:
state
涉及渲染或数据流,则使用other instance fields
存储数据(即,如果其直接或间接用于渲染方法中)如果某些值未用于呈现或数据流(例如计时器ID),则您没有 使其处于状态。可以将这些值定义为 组件实例