嘗試一下php
1.那麼問題來了這些週期方法爲何不能夠setState?
2.setState異步機制,怎麼處理,setState(函數)?html
componentDidMount() { SynapseAnalytics.init({ type:Enum.pageTypeEnum.otherPage }); this.setState({ val:this.state.val + 1 }); //第一次輸出 0 console.log(this.state.val); this.setState({ val:this.state.val + 1 }); //第二次輸出 0 console.log(this.state.val); setTimeout(()=>{ this.setState({val:this.state.val + 1}); //第三次輸出 2 console.log(this.state.val); this.setState({ val:this.state.val + 1 }); //第四次輸出 3 console.log(this.state.val); }, 0); }
function enqueueUpdate(component){ //injected注入的 ensureInjected(); //若是不處於批量更新模式 if(!batchingStrategy.isBatchingUpdates){ batchingStrategy.batchedUpdates(enqueueUpdate, component); return; } //若是處於批量更新模式 dirtyComponents.push(component); }
因此攢的過程當中若是你不停的set同一個state的值,只會觸發最後一次,例如上面那道題數組
其實setState還有一個用法,它不止能夠接受對象做爲參數,還能夠接受函數。異步
直接看代碼:函數
componentDidMount(){ SynapseAnalytics.init({type:Enum.pageTypeEnum.otherPage}); this.setState(this.fn.bind(this)); //第一次輸出 console.log(this.state.val); this.setState(this.fn.bind(this)); //第二次輸出 console.log(this.state.val); setTimeout(()=>{ this.setState({val:this.state.val+1}); //第三次輸出 console.log(this.state.val); this.setState({ val:this.state.val+1 }); //第四次輸出 console.log(this.state.val); },0); } fn(state,props){ return{ val:state.val+1 } }
我理解這個state其實就至關於一個全局變量,每次累加的不是this.state,而是state這個變量,因此不管累加多少次,最後將state這個變量賦值給this.state。
注意:在這累加的過程當中,若你在函數式的setState方法後面又穿插使用了傳統的對象式(this.setState({val:this.state.val + 1}))的話,以前累加的就全白費了,由於上面說過了this.state.val仍是0,它只有在render以後纔會改變。this