firebase onSnapshot 如何刷新数组以避免重复键?

Posted

技术标签:

【中文标题】firebase onSnapshot 如何刷新数组以避免重复键?【英文标题】:firebase onSnapshot how to refresh arrays to avoid duplicate keys? 【发布时间】:2021-06-14 04:29:30 【问题描述】:

这是我用来监听 Firestore 数据库更改的代码:

 async mounted() 
let id = [];
let orders = [];
await db.collection("orders").onSnapshot(doc => 
  includeMetadataChanges: true;

  doc.docs.forEach(x => 
    id.push(x.id);
    let z = Object.assign(x.data(),  id: x.id );
    orders.push(z);
  );
);

我正在使用 vuejs,在挂载阶段添加此侦听器,以便依赖此快照的数组不断刷新。但是我遇到了一个问题,即当数据库发生更改时,我的新快照将数据添加到数组中,这会导致所有重复的键,我找不到在插入之前重置每个快照上的数组的有效方法新版本。

id 数组是我用来提取 id 然后将其插入到 orders 数组中的数组,以便我可以在内部使用它。

编辑:

 async mounted() 
let id = [];
let orders = [];
await db.collection("orders").onSnapshot(doc => 
  includeMetadataChanges: true;
orders = []
id = []
  doc.docs.forEach(x => 
    id.push(x.id);
    let z = Object.assign(x.data(),  id: x.id );
    orders.push(z);
  );
); 
  
console.log(orders)

当我在回调中重置订单数组时,我得到一个空数组。

编辑 2- 我发现了错误: 我算错了保存数组的位置。

  this.$store.dispatch("mystore/saveOrders", orders);

我应该将它放在 onSnapshot 函数中,因此每次运行时我都会进行保存,起初我在 onsnapshot 侦听器之后的已安装函数中,但我不得不重置订单,如 Frank van Puffelen 的回答中所述.

【问题讨论】:

【参考方案1】:

你有两个选择:

最简单的方法是在每次调用回调时清除数组,因为doc.docs 包含所有相关数据以无论如何都要重建 UI。所以这将在回调顶部调用orders = []

如果您想对更新 UI 进行更精细的控制,您可以迭代 doc.docChanges,它允许您使用 view the changes between the snapshots。因此,您可以确定哪些文档已添加到快照中(最初将是所有文档)、哪些已删除以及哪些文档已更新。

如今,许多 UI 框架会根据您提供的数据对 UI 进行最少的更新,因此我绝对建议在采用第二种方法之前检查 Vue 是否也是这种情况。

【讨论】:

以上是关于firebase onSnapshot 如何刷新数组以避免重复键?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase“onSnapshot”侦听器值更新 Vue“ref”?

如何在 Firebase onSnapshot 中使用 .catch

等待 onSnapshot 获取数据

Firebase firestore onSnapshot 在 useEffect 中无法正常工作

Firebase onSnapshot函数上的无限循环正常吗?

cleanup() 在使用 Firebase Firestore onSnapshot 的 useEffect() 中不起作用