实现代码
import React, { Component } from 'react';
class Counter extends Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState((prevState) => ({
count: prevState.count + 1
}));
}
render() {
return (
<div>
<p>Count: {this.state.count}</p>
<button onClick={this.handleClick}>Increment</button>
</div>
);
}
}
export default Counter;
不能直接使用 this.state.count = this.state.count + 1
的原因
- React 的单向数据流机制:React 遵循单向数据流,状态更新应该通过
setState
方法触发。直接修改 this.state
不会触发组件的重新渲染,因为 React 无法检测到这种变化。
- 批处理机制:
setState
会将多个状态更新操作合并,在合适的时机统一处理,提高性能。直接修改 this.state
破坏了这种批处理机制。
React 协调事件处理与状态更新的方式
- 事件绑定:在 React 中,事件处理函数通过
onClick
等属性绑定到组件元素上。当事件触发时,相应的处理函数被调用。
- 状态更新:处理函数中调用
setState
方法,setState
会将新的状态与当前状态合并,并触发组件的重新渲染。
- 批处理:React 在事件处理过程中,会批量处理多个
setState
调用,减少不必要的重新渲染,提高性能。例如,在一个事件处理函数中多次调用 setState
,React 会将这些更新合并成一次处理。