深入理解react的setState
发布时间:2020-12-15 06:29:13 所属栏目:百科 来源:网络整理
导读:1.组件挂载图 了解生命周期函数的执行顺序 2.生命周期执行顺序 尝试一下 可以看到在组件在组件初始化时,只执行如下三个方法: 在父组件状态改变时,依次执行的生命周期函数是: 我试着分别在这几个生命周期函数中setState了一下,发现在componentWillUpdate
1.组件挂载图
2.生命周期执行顺序尝试一下
1.那么问题来了这些周期方法为什么不可以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还有一个用法,它不止可以接受对象作为参数,还可以接受函数。 3.函数式的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之后才会改变。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |