老师,我自己写的在 setTimeout 里和 DOM 事件里的 setState,为什么还是异步的呀?这个和React 版本有关系吗
"react": “^18.2.0”,
import React from "react";
class StateDemo extends React.Component {
constructor(props) {
super(props);
// 1. state 要在构造函数中定义
this.state = {
count: 0
}
}
render() {
return (
<div>
<p>{this.state.count}</p>
<button onClick={this.handleClick}>increase</button>
</div>
)
}
handleClick = () => {
// 3. 同步或异步
// 直接调用是异步
// setTimeout 中 setState 是同步的
setTimeout(() => {
this.setState({
count: this.state.count + 1
}, () => {
console.log('cb', this.state.count) // 回调里可以拿到最新值,点一次后是1
})
console.log('after',this.state.count) // 但我实际测试,这里还是0
}, 0)
}
componentDidMount() {
// 原生 DOM 事件中,是同步的
document.body.addEventListener('click', () => {
this.setState({
count: this.state.count + 1
})
console.log('count in body event',this.state.count) // 实际测试这里还是0
})
}
}
export default StateDemo;
登录后可查看更多问答,登录/注册