1.那么问题来了这些周期方法为什么不可以setState? 2.setState异步机制,怎么处理,setState(函数)?
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之后才会改变。