前端拾遗--react-setSate同步异步问题

React合成事件和原生事件区别

  • React合成事件一套机制:React并非将click事件直接绑定在dom上面,而是采用事件冒泡的形式冒泡到document上面,而后React将事件封装给正式的函数处理运行和处理。javascript

  • React合成事件理解 若是DOM上绑定了过多的事件处理函数,整个页面响应以及内存占用可能都会受到影响。React为了不这类DOM事件滥用,同时屏蔽底层不一样浏览器之间的事件系统差别,实现了一个中间层——SyntheticEvent。前端

class App extends React.Component{
    constructor(props){
        super(props);
        this.state={
            num:1
        }
    }
    componentDidMount(){
        this.clickFunc();
    }
   
    addNum(e){
        console.log('react合成事件');
        this.setState({num:this.state.num+1});
        console.log(this.state.num);
        
        // react合成事件
        // 1
    }
    
    //原生事件与setTimeout中不会进行批量更新
    clickFunc(){
        document.querySelector('#btn').addEventListener('click',()=>{
            console.log('原生事件');
            this.setState({num:this.state.num+1});
            console.log(this.state.num);
            this.setState({num:this.state.num+1});
            console.log(this.state.num);
            this.setState({num:this.state.num+1});
            console.log(this.state.num);
            
            // 原生事件
            // 2, 3, 4
        })
    }
    render(){
        return(
            <div> <h1>{this.state.num}</h1> {/* react的合成事件 */} <button onClick={(e)=>{this.addNum(e)}}>React合成事件的按钮</button> {/* 原生DOM事件 */} <button id='btn'>绑定原生DOM事件的按钮</button> </div>
        )
    }
}
复制代码

补充知识:

有时表现出异步,有时表现出同步java

  1. setState只在合成事件和钩子函数中是“异步”的,在原生事件和setTimeout 中都是同步的。
  2. setState 的“异步”并非说内部由异步代码实现,其实自己执行的过程和代码都是同步的,只是合成事件和钩子函数的调用顺序在更新以前,致使在合成事件和钩子函数中无法立马拿到更新后的值,造成了所谓的“异步”,固然能够经过第二个参数 setState(partialState, callback) 中的callback拿到更新后的结果。
  3. setState 的批量更新优化也是创建在“异步”(合成事件、钩子函数)之上的,在原生事件和setTimeout 中不会批量更新,在“异步”中若是对同一个值进行屡次setState,setState的批量更新策略会对其进行覆盖,取最后一次的执行,若是是同时setState多个不一样的值,在更新时会对其进行合并批量更新。

外链

相关文章
相关标签/搜索