【问题标题】:How to stop Firestore `get` query on componentWillUnmount如何停止对 componentWillUnmount 的 Firestore `get` 查询
【发布时间】:2019-03-02 14:58:05
【问题描述】:

好的,所以我在 componentDidMount 中从 Firestore 获取数据,但是当我更改组件时它正在获取数据时出现错误提示:

警告:无法在未安装的设备上调用 setState(或 forceUpdate) 零件。这是一个无操作,但它表明您的内存泄漏 应用。要修复,请取消所有订阅和异步任务 在 componentWillUnmount 方法中。

在 Firebase 实时数据库中,我们调用 ref.off() 来停止查询。

想知道如何在 Firestore 中做到这一点

componentDidMount() {
  Users.get().then(({ docs }) => {
    const users = docs.map(user => user.data());
      this.setState({ users });
  });
}

componentWillUnmount(){

}

【问题讨论】:

  • 我认为没有办法中止正在进行的get() 操作。对于onSnapshot(),你会得到一个订阅,你可以打电话取消订阅,但据我所知get 没有。
  • 如何取消订阅onSnapshot()

标签: javascript reactjs firebase google-cloud-firestore


【解决方案1】:

由于Get 不是实时方法,因此无法在 componentWillUnmont 上停止它,因此一旦卸载组件就不应调用它。

【讨论】:

    【解决方案2】:

    如果有人仍在寻找答案,我找到了解决方法:

    componentDidMount() {
      this.mounted = true;
    
      Users.get().then(({ docs }) => {
        const users = docs.map(user => user.data());
          if(this.mounted) this.setState({ users });
      });
    }
    
    componentWillUnmount(){
      this.mounted = false;
    }
    

    this.mounted 会在组件被卸载并且 setState 不起作用时为 false。

    【讨论】:

    • 这并没有真正中止不必要的获取或保存网络带宽,它只是抑制了关于内存泄漏的React 警告
    猜你喜欢
    • 2018-11-17
    • 2016-12-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多