【问题标题】:Listen to Firebase Firestore data changes for current data only?仅收听当前数据的 Firebase Firestore 数据更改?
【发布时间】:2023-03-18 09:57:01
【问题描述】:

假设我有一个名为“Articles”的 Firebase firestore 数据库表。

每当我打开应用程序时,我都会拉入一个文章列表,并且通过一个 FlatList 组件,每当我到达末尾时,我都会使用 startAt() 和 endAt() 拉入更多文章

我还可以点赞或评论文章,所以每当我这样做时,屏幕上的当前文章都会更新(如计数器、评论计数器会更新)。

但是,我还有一个单独的后端,它会在 6 小时间隔后将其他文章添加到数据库中。

如果我订阅了 Articles 数据库中的更改,那么如果在用户滚动 Flatlist 时添加了新数据,startAt() 和 endAt() 就会变得混乱(对吗?)。相反,我只想在添加新文章时通知用户,并在有任何文章时在顶部显示“新文章可用”按钮,如果用户点击它,它只会刷新列表。

但是,我还是想听听文章的点赞数和cmets的变化,而不是在后台添加新文章的时候往flatlist中添加任何新文章。

我该如何解决这个问题?

【问题讨论】:

    标签: javascript reactjs firebase react-native google-cloud-firestore


    【解决方案1】:

    您可以检查事件的类型,即文档是createdmodified 还是deleted,如documentation 中所述。如果添加了新文档,则类型将为"created"。然后不要将它们附加到您的平面列表中。任何更新的点赞数都将是 "modified" 事件,因此您可以在列表中更新它。这是从文档中复制的示例:

    db.collection("cities").where("state", "==", "CA")
        .onSnapshot((snapshot) => {
            snapshot.docChanges().forEach((change) => {
                if (change.type === "added") {
                    console.log("New city: ", change.doc.data());
                }
                if (change.type === "modified") {
                    console.log("Modified city: ", change.doc.data());
                }
                if (change.type === "removed") {
                    console.log("Removed city: ", change.doc.data());
                }
            });
        });
    

    重要提示:第一个查询快照包含与查询匹配的所有现有文档的添加事件。这是因为您正在获得一组更改,这些更改使您的查询快照与查询的初始状态保持同步。例如,这使您可以直接根据您在第一个查询快照中收到的更改填充您的 UI,而无需添加特殊逻辑来处理初始状态。

    因此,当用户第一次打开您的应用并同时添加新文档时,它们可能最终会出现在列表中。如果您仍想严格控制这些文档的添加时间,您可以尝试添加一个条件,说明查询中返回的文档应在特定时间戳之前创建。

    .where("addedAt", "<=", <the-timestamp>)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-14
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 2017-07-26
      • 1970-01-01
      相关资源
      最近更新 更多