前端拾遺--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多個不一樣的值,在更新時會對其進行合併批量更新。

外鏈

相關文章
相關標籤/搜索