一,出现以上异常的缘由分析:ajax
由于在组件挂载(mounted)以后进行了异步操做,好比ajax请求或者设置了定时器等,而你在callback中进行了setState操做。当你切换路由时,组件已经被卸载(unmounted)了,此时异步操做中callback还在执行,所以setState没有获得值。异步
二,解决方案:this
(1)在卸载的时候对全部的操做进行清除:
componentDidMount = () => { //1.ajax请求 $.ajax('你的请求',{}) .then(res => { this.setState({ aa:true }) }) .catch(err => {}) //2.定时器 timer = setTimeout(() => { //dosomething },1000) } componentWillUnMount = () => { //1.ajax请求 $.ajax.abort() //2.定时器 clearTimeout(timer) }
(2)、设置一个flag,当unmount的时候重置这个flag
componentDidMount = () => { this._isMounted = true; $.ajax('你的请求',{}) .then(res => { if(this._isMounted){ this.setState({ aa:true }) } }) .catch(err => {}) } componentWillUnMount = () => { this._isMounted = false; }
(3)、组件卸载的时候直接return
componentDidMount = () => { $.ajax('你的请求',{}) .then(res => { this.setState({ data: datas, }); }) .catch(error => { }); } componentWillUnmount = () => { this.setState = (state,callback)=>{ return; }; }