提问者:小点点

React Native无法对未安装的组件firebase执行React状态更新


我有这段代码,当添加新的子对象时,它会侦听实时数据库中的更改。

mUserRef = firebase.database().ref("Messages").child(conversation);
mUserRef.on("child_added", snapshot => {
    const message = {
        key: snapshot.key,
        ...snapshot.val()
    };
    this.onReceive(message);
});

当收到添加到数据库ref的新子项时,将触发此代码

let cy = this;
        firebase
        .database()
        .ref("LastMessages")
        .child(key)
        .once("value")
        .then(function(snapshot) {
            //...some code
        }); 

问题是,当我使用componentWillUnmount时,我无法取消订阅实时侦听器

退订代码

constructor(props) {
    super(props);
    this.state = {
      ready: false,
      messages: []
    };
  }
  _isMounted = false;


componentDidMount = async () => {
    this._isMounted = true;
}

  async retriveMessages(conversation) {
    let cy = this;

    cy.setState({
      ready: true
    });
    let mUserRef = null;
    if (this._isMounted) {
      mUserRef = firebase
        .database()
        .ref("Messages")
        .child(conversation);

      mUserRef.on("child_added", snapshot => {
        const message = {
          key: snapshot.key,
          ...snapshot.val()
        };
        this.onReceive(message);
      });
    } else {
      mUserRef.child(conversation).off("child_added");
    }
  }


  componentWillUnmount() {
    this._isMounted = false;
  }

我尝试过的解决方案:

取消订阅Firebase实时数据库

组件将卸载以取消订阅firestore

如何删除firebase数据库侦听器。。。

当我转到另一个屏幕时,如何停止Firebase侦听器?


共1个答案

匿名用户

组件将卸载()

在卸载和销毁组件之前立即调用。在此方法中执行任何必要的清理,例如使计时器无效、取消网络请求或清理在组件DDMount()中创建的任何订阅。

因此,请执行以下操作:

 componentWillUnmount() {
    mUserRef.off("child_added");
    this._isMounted = false;
  }