我正在使用Firebase Listener on
Redux操作中获取屏幕中的数据。这是我下面的 redux 操作代码:
export const getSelectedProjectDetail = (groupUid, projectUid) => dispatch => {
dispatch({
type: GET_SELECTED_PROJECT_DETAIL_START,
});
firebase.database().ref('/groups/' + groupUid + '/projects/' + projectUid).on('value', (mainSnap) => {
firebase
.database()
.ref('/users/' + mainSnap.val().creator.uid)
.on('value', snapshot => {
const messagesList = _.map(mainSnap.val().messages, (val, uid) => ({ ...val, uid }));
for (let index = 0; index < messagesList.length; index++) {
// eslint-disable-next-line no-loop-func
firebase.database().ref('/users/' + messagesList[index].author.uid).on('value', function (childSnapshot) {
messagesList[index] = {
...messagesList[index],
author: {
...messagesList[index].author,
name: childSnapshot.val().displayName,
email: childSnapshot.val().email,
},
};
if (index === messagesList.length - 1) {
const selectedProjectDetail = {
...mainSnap.val(),
creator: { ...mainSnap.val().creator, name: snapshot.val().displayName },
messages: _.reverse(messagesList),
};
dispatch({
type: GET_SELECTED_PROJECT_DETAIL_SUCCESS,
payload: selectedProjectDetail,
});
NavigationService.navigate('ProjectDetail');
}
});
}
});
});
};
问题是,当我在另一个屏幕上时我的数据库中发生了变化时,屏幕会传递给带有侦听器的屏幕。我想,当我关闭屏幕时,我需要停止听众。如何使用 Firebase 功能或任何功能阻止它们?
如果你在 redux 中添加侦听器,就像
const myRef = '/users/' + messagesList[index].author.uid
firebase.database().ref(myRef).on('value',
function (childSnapshot) {
messagesList[index] = {
...messagesList[index],
author: {
...messagesList[index].author,
name: childSnapshot.val().displayName,
email: childSnapshot.val().email,
},
};
您需要将该myRef
保存在 redux 存储中
卸载时,在组件将卸载您可以调度另一个操作,然后您可以通过以下方式删除侦听器 firebase.database().ref('myRef').off('value', callback)
届时,您可以从 Redux 存储中获取myRef
变量