Vuejs 和 Firestore - 如何在 Firestore 中的数据更改时进行更新
Posted
技术标签:
【中文标题】Vuejs 和 Firestore - 如何在 Firestore 中的数据更改时进行更新【英文标题】:Vuejs & Firestore - How to Update when Data Changes in Firestore 【发布时间】:2018-08-22 07:03:21 【问题描述】:我已经阅读了大量教程和文档,但当 Firestore 中的数据发生变化时,我似乎无法在页面上进行更新(注意:不是 Firebase)
这是我目前所拥有的一切正常,除非数据库中的数据发生变化,除非我刷新,否则它不会反映在页面本身上。下面的代码在脚本标签内:
import recipeRef from '../../firebase';
export default
data()
return
recipes: []
,
firestore:
recipes: recipeRef
,
created()
db.collection('recipes').get().then((onSnapshot) =>
this.loading = false
onSnapshot.forEach((doc) =>
let data =
'id': doc.id,
'name': doc.data().name
this.recipes.push(data)
)
)
我没有使用 Vuex。添加数据,编辑和阅读工作正常。只是在数据发生变化后不反映变化。也许我应该使用一个生命周期钩子?对于“onSnapshot
”——我试过“snap
”、“querySnapshot
”等。没有运气。
提前致谢。
【问题讨论】:
【参考方案1】:删除 get()
并替换为快照 - 就像这样
created()
db.collection('recipes').onSnapshot(snap =>
let foo = [];
snap.forEach(doc =>
foo.push(id: doc.id, name: doc.data().name)
);
);
【讨论】:
不是说要打数据库,会很贵吗?【参考方案2】:我不熟悉 firestore API,但浏览文档,看起来调用 get()
是您一次查询的方式。您拥有onSnapshot
的位置实际上应该是querySnapshot
- 即一个查询的结果。见:
对比:
https://firebase.google.com/docs/firestore/query-data/listen因此,要获得实时更新,您似乎需要创建一个侦听器,如下所示:
db.collection('recipes')
.onSnapshot(function(snapshot)
snapshot.forEach(function(doc)
// Find existing recipe in this.recipes
// and swap in the new data
);
, function(error)
// handle errors
);
我认为您需要将该侦听器添加到您当前正在执行的get()
查询中。希望这会有所帮助!
【讨论】:
以上是关于Vuejs 和 Firestore - 如何在 Firestore 中的数据更改时进行更新的主要内容,如果未能解决你的问题,请参考以下文章
firebase(firestore)和vuejs + vuefire的非常奇怪的反应性问题
Firestore 存储后无法分配给 VueJS 中的数据变量
firestore onSnapshot 更新值,但不更新 VueJS 中的 DOM
Vuejs + Firebase Storage 将多个图像上传到 Firebase Storage 并将所有 downloadURL 推送到 Firestore