Can’t perform a React state update on an unmounted component

栏目: 服务器 · 发布时间: 6年前

导语: 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 更新时,当前组件已被销毁了,无法更新。

解决方法:

  1. 若您的异步请求可以取消的话,在 componentWillUnmount 中取消请求;

  2. 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>
    );
}
  1. 使用高阶组件重新封装 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程序设计的抽象思维

C程序设计的抽象思维

Eric S.Roberts / 闪四清 / 机械工业出版社 / 2012-5 / 99.00元

Eric S. Roberts所著的《C程序设计的抽象思维》是一本关于C语言的经典图书。本书共计17章,分为4部分,第一部分概述计算机导论课程中涉及的基本编程概念;第二部分讨论递归算法,其中结合大量示例,有助于读者轻松理解和掌握晦涩的概念;第三部分不仅介绍了用非递归算法实现的抽象数据类型,还提供了一些工具,有助于读者理解数据抽象的概念;第四部分重点介绍采用递归算法实现的抽象数据类型。本书重点突出,......一起来看看 《C程序设计的抽象思维》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具