无法摆脱:警告:无法在未安装的组件上执行React状态更新

时间:2020-10-18 17:44:01

标签: javascript reactjs react-native react-native-android

完整警告消息:警告:无法在已卸载的组件上执行React状态更新。这是空操作,但它表明应用程序中发生内存泄漏。要修复,请取消使用useEffect清理功能中的所有订阅和异步任务。

此警告未始终显示,而是在需要时显示。该应用刚刚启动的最长时间。

export default class something extends React.Component {
  _isMounted = false;
  state = {
    
  };

componentDidMount() {
    this._isMounted = true;
    firebase = new Fire((error, user) => {
      if (error) {
        return alert('something something something something');
      }

      firebase.getLists((lists) => {
        this.setState({ lists, user }, () => {
            this.setState({ loading: false });
        });
      });
      this.setState({ user });
    });
  }

componentWillUnmount() {
    this._isMounted = true;
    firebase.detach();
  }

这位于另一个包含所有firebase代码的文件中

detach() {
    this.unsubscribe();
  }

我猜这与分离firebase.detach

有关

1 个答案:

答案 0 :(得分:0)

您的代码中需要一些小的更新才能使其正常工作。

在更新任何状态变量之前,您需要检查_isMounted是否为true

您还希望在_isMounted=false中设置componentWillUnmount(),而不是_isMounted=true

请参见下面的更新代码:

export default class something extends React.Component {
  _isMounted = false;
  state = {
    
  };

componentDidMount() {
    this._isMounted = true;
    firebase = new Fire((error, user) => {
      if (error) {
        return alert('something something something something');
      }

      firebase.getLists((lists) => {
        if (this._isMounted){
          this.setState({ lists, user }, () => {
            this.setState({ loading: false });
          });
        }
      });
      if (this._isMounted){
        this.setState({ user });
      }
    });
  }

componentWillUnmount() {
    this._isMounted = false;
    firebase.detach();
  }