我有这段代码,当添加新的子对象时,它会侦听实时数据库中的更改。
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侦听器?
组件将卸载()
:
在卸载和销毁组件之前立即调用。在此方法中执行任何必要的清理,例如使计时器无效、取消网络请求或清理在组件DDMount()中创建的任何订阅。
因此,请执行以下操作:
componentWillUnmount() {
mUserRef.off("child_added");
this._isMounted = false;
}