尝试一下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