在使用react-native-firebase
的react本机应用程序中的一个操作中,我创建了一个Firestore快照侦听器:
监听器:
export const onAgendaChange = (uid, role, dispatch) => {
// query based off role
let query;
if (role == 'Receiver') {
query = 'receiver.uid';
} else {
query = 'sender.uid';
}
console.log('(actions/agenda) Firestore Read: getAgenda()');
return firebase
.firestore()
.collection('events')
.where(query, '==', uid)
.orderBy('date')
.onSnapshot((querySnapshot) => {
const agenda = []
querySnapshot.forEach((doc) => {
let event = doc.data();
event.id = doc.id;
agenda.push(event);
dispatch({ type: types.LOAD_AGENDA_SUCCESS, payload: agenda });
});
querySnapshot.docChanges().forEach(function (change) {
if (change.type === "added") {
console.log("Add heard: ", change.doc.data());
}
if (change.type === "modified") {
console.log("Modified heard: ", change.doc.data());
}
if (change.type === "removed") {
console.log("Removed heard: ", change.doc.data());
}
});
});
};
我观察到的一个问题是在初始应用程序加载时,当这个监听器执行时,它返回一个错误:
TypeError:querySnapshot.docChanges不是函数。(在"querySnapshot.docChanges((","querySnap快照.docChanges"是阵列实例(
我观察到的下一个问题是,如果重新加载应用程序,则不会生成上述错误,因此,如果引用的集合中的文档发生了更改,docChanges()
仍然不会记录任何内容。这是直接从firebase文档中获取的。当在"where"或"orderBy"上使用onSnapshot()
时,回调将接收一个querySnapshot对象,该对象确实将docChanges()
作为方法。有什么想法吗?
这个问题是由于在使用react原生firebase时过于关注firebase文档造成的。
虽然该库确实镜像了95%的firebase文档,但在这种情况下,它并没有。
对于react原生firebase,docChanges
是一个属性,而不是一个函数,所以您想使用:
querySnapshot.docChanges.forEach(function (change) {
if (change.type === "added") {
console.log("Add heard: ", change.doc.data());
}
if (change.type === "modified") {
console.log("Modified heard: ", change.doc.data());
}
if (change.type === "removed") {
console.log("Removed heard: ", change.doc.data());
}
});