无法在已卸载的组件上执行React状态更新,并且状态未更新

时间:2020-02-05 06:45:16

标签: reactjs

我收到此警告消息,并且我的状态也没有更新。有人可以帮我吗?

代码如下:

componentDidMount = async () => {
    this.setState({ isLoading: true });
    const { state } = this.props.location;
    console.log(state);
    if (state && state.mesg) {
      this.setState({
        mesg: this.props.location.state.mesg,
        mesgType: this.props.location.state.mesgType
      });
      const stateCopy = { ...state };
      delete stateCopy.mesg;
      this.props.history.replace({ state: stateCopy });
    }

    this.closeMesg(1000);

    let pageNo = this.props.location.search.split("=");
    await this.fetchProfessionsAPI(pageNo[1] || 1);
    this.setState({ isLoading: false });
  };

现在此消息和消息类型未更新。另外,还会出现以下错误:

index.js:1472警告:无法在服务器上执行React状态更新 未安装的组件。这是空操作,但表示内存泄漏 在您的应用程序中。要修复,请取消所有订阅并进行异步 componentWillUnmount方法中的任务。 专业(由ConnectFunction创建) 在ConnectFunction中(在HomePage.js:140上) 在组件中(由Context.Consumer创建)

还可以显示以下内容:

错误:给定操作“ FETCH_PROFESSIONS”,减速器“ professions” 返回未定义。要忽略动作,必须显式返回 以前的状态。如果您希望该减速器不具有任何价值,则可以 返回null而不是未定义。 结合使用(redux.js:463) 在p(:1:36402) 在v(:1:36684) 在:1:40069 在Object.dispatch(redux.js:212) 在e(:1:40553) 在index.js:11 在Object.dispatch(redux-saga-core.esm.js:1423) 派遣时(:1:28545) 在Object.passToRedux(Professions.js:273) 在Professions.js:96

1 个答案:

答案 0 :(得分:0)

在卸载组件后执行状态更改时显示。

Exp如果您发送异步API调用并根据其响应更新状态,但是在API响应之前,您离开该组件(更改路线或访问另一页面),则会显示此警告。因为异步API调用会在响应被卸载后尝试更改状态。

解决方案:取消componentWillUnmount()方法中的所有异步调用。

componentWillUnmount(){
  //cancel API call etc which in progress and will update state.
}