导语: Warning: Can’t perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in t
最近项目中有一个这样的需求,从别的项目要转到我项目中的某个页面,不过回退时要可以回退到项目的首页。
实现这样的跳转的话,应当是首先要跳转到项目的首页,然后再从首页跳转到对应的页面。
我最开始的实现是这样的:
componentDidMount() {
const jumpUrlList = ['own'];
const jumpUrl = getQueryString('jumpto');
const targetJump = window.sessionStorage && window.sessionStorage.getItem('targetJump');
// 防止无限跳转,使用sessionStorage存储一个标记,整个周期内只跳转一次
if (jumpUrlList.indexOf(jumpUrl) > -1 && !targetJump) {
window.location.href = '#/' + jumpUrl;
window.sessionStorage.setItem('targetJump', '1');
}
}
但运行时,会提示这个错误:
Warning: Can’t perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method.
意思是:无法对没有实例的组件进行响应状态更新。您可以在 componentWillUnmount 方法中取消所有的订阅和异步任务。
因为我在首页中有异步请求,请求返回回来后,使用 setState 更新视图。但我已经跳转到别的路由了,导致 setState 更新时,当前组件已被销毁了,无法更新。
解决方法:
-
若您的异步请求可以取消的话,在 componentWillUnmount 中取消请求;
-
在
render()方法中进行判断,若可以跳转,则直接不渲染;
render() {
const jumpUrlList = ['own'];
const jumpUrl = getQueryString('jumpto');
const targetJump = window.sessionStorage && window.sessionStorage.getItem('targetJump');
if (jumpUrlList.indexOf(jumpUrl) > -1 && !targetJump) {
window.location.href = '#/' + jumpUrl;
window.sessionStorage.setItem('targetJump', '1');
return null;
}
return (
<div className="home">
<User />
</div>
);
}
-
使用高阶组件重新封装 componentWillUnmount 和 setState;
function inject_unount(target) {
// 改装componentWillUnmount,销毁的时候记录一下
let next = target.prototype.componentWillUnmount;
target.prototype.componentWillUnmount = function() {
if (next) next.call(this, ...arguments);
this.unmount = true;
};
// 对setState的改装,setState查看目前是否已经销毁
let setState = target.prototype.setState;
target.prototype.setState = function() {
if (this.unmount) return;
setState.call(this, ...arguments);
};
}
@inject_unount
class BaseComponent extends Component {}
//以后我们写组件时直接继承BaseComponent
@2019-06-03 18:03 评论(0)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C程序设计语言
Brian W. Kernighan、Dennis M. Ritchie / 机械工业出版社 / 2006-8-1 / 35.00元
在计算机发展的历史上,没有哪一种程序设计语言像C语言这样应用广泛。本书是C语言的设计者之一Dennis M.Ritchie和著名计算机科学家Brian W.Kernighan合著的一本介绍C语言的权威经典著作。我们现在见到的大量论述C语言程序设计的教材和专著均以此书为蓝本。本书第1版中介绍的C语言成为后来广泛使用的C语言版本——标准C的基础。人们熟知的“hello,World"程序就是由本书首次引......一起来看看 《C程序设计语言》 这本书的介绍吧!