javascript - Firebase firestore onSnapshot 没有在 ReactJs 应用程序上获取更改和渲染
问题描述
我们有一个使用 Firebase 的 ReactJs 应用程序。当您首次注册应用程序并首次登录时,应用程序使用该onSnapshot
方法从 Firebase 加载一个文档,并呈现一个使用视图中数据的组件。问题是,当我们对加载的文档进行更改并将这些更改写回 Firebase 时,ReactJs 应用程序没有发现这些更改已被应用,因此视图没有更新。但是,如果我们刷新应用程序,我们所做的更改会被渲染,并且未来的更改会正常获取,一切都很好。
这是我们调用该onSnapshot
方法的代码。您可以看到我在其中粘贴了一些调试文本,仅在未加载文档时才呈现一次,因此我知道问题在于这没有在 firestore 中获取文档更改。
function useHub(hubId) {
console.debug("useHub");
const Firebase = React.useContext(FirebaseContext);
const [loading, setLoading] = React.useState(true);
const [error, setError] = React.useState(false);
const [hub, setHub] = React.useState(null);
React.useEffect(() => {
console.debug("useHub: useEffect");
setHub(null);
console.log('****************************');
console.log("Hub ID " + hubId);
if (hubId) {
const unsubscribe = Firebase.firestore()
.collection("hubs")
.doc(hubId)
.onSnapshot(
(doc) => {
const hubDoc = Object.assign({}, { id: doc.id }, doc.data());
console.log('***************************');
console.log('***************************');
console.log(hubDoc);
console.log('***************************');
console.log('***************************');
setHub(hubDoc);
setLoading(false);
setError(false);
},
(error) => {
console.error("Error:", error);
setError(error.message);
setLoading(false);
}
);
return () => unsubscribe();
}
}, [Firebase, hubId]);
return {
loading,
error,
hub,
};
}
export { useHub };
发生这种情况的可能原因是什么?
解决方案
您可以考虑让您的组件自行更新作为一种解决方法。我在这里找到了这个文件,它描述了细节。
推荐阅读
- vue.js - Vuejs - 如何将道具的默认值设置为预定义数据?
- python-3.x - 如何排序和删除具有相同第一个元素的元组并仅保留第一次出现
- vba - 我可以使用 VBA 进行条件循环以在有条件格式的表格上查找交通灯图标吗
- vim - 使用“/”和“[”在 GVIM 单词中搜索
- c++ - 在函数中将 ifstream 作为参数传递
- django - 从 html 按钮调用 django 函数
- node.js - Google 表格 POST 请求 - 有效负载过大错误
- android - 如何在 Kotlin 中设置使用 AsyncTask 运行我的代码
- java - Kotlin:可以在包外访问内部类
- javascript - 为什么我的 jQuery 在页面加载时不起作用?