setTimeout 里仍然异步

来源:7-12 setState何时会合并state

要啥要啥自行车

2022-06-29

老师,我自己写的在 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;
写回答

2回答

双越

2022-06-29

有关系。

React 18 在这块做了调整,setTimeout 和 DOM 事件中的 setState 也都成了异步的了。

关于这块我正在准备升级内容补充。

0
3
双越
回复
要啥要啥自行车
是的。
2022-06-30
共3条回复

qq_艾诺_

2022-09-09

react18更新了,setState都是异步的了。

0
0

2024版 前端框架及项目面试 聚焦Vue3/React/Webpack

面向1-3年前端的框架及项目面试“刚需内容”

4664 学习 · 1644 问题

查看课程