【问题标题】:get more data after some given id in firebase在firebase中给定一些ID后获取更多数据
【发布时间】:2020-04-19 23:41:02
【问题描述】:

我是使用 firebase 的新手,我想对我的帖子进行无限滚动分页。

假设我有这个帖子 IDS:

-M5HMGs3EnBv6O2NSxG
-M5HMGsA3YyW_NJ3fSV
-M5HMGsdfLOOEPPBR_s
-M5HMGsiH9HIZw9DNaz
-M5HMHFYoUX8kNolLrP
-M5HMHFZvDrV27S2hSt
-M5HMHFnrQ_l4mVQ0rX
-M5HMHFoaV8wbexwPCd
-M5HMJQaaFGxF450lJB
-M5HMJQe319R19Cvak6 // THE LAST ONE IN FIRST PAGINATION
-M5HMJQh2gWuah7GSht
-M5HMJQlrcfTTF3fbbI
-M5HMJQo6QT1HwWP2lz
-M5HMJQrIUiZyzhiqK3
-M5HMJQudSkFdvs42D1
-M5HMJRCmbFbxKp1NgA
-M5HMJRFwfo7yN8Is3-
-M5HMJRIsKT3YmoukQ0
-M5HMJRKDTq7XuqtshT
-M5HMJRNRabXbYQUMi6
-M5HMJRS1t9UBzH_3Jh
-M5HMJRXEv6BaPeQPMn
-M5HMJR_bRdxCBy-uma
-M5HMJRdOPBA-SMoMjB

所以,首先我得到前 10 个帖子,直到 id M5HMJQe319R19Cvak6 使用这个:

var starCountRef = firebase.database().ref('/posts/').limitToFirst(11);

没关系。当我转到最后一篇文章时,我的 reactjs 将再次调用此函数,在变量 pageNumber 中发送最后加载的文章 ID(M5HMJQe319R19Cvak6)。

我想做的是在给定最后一个 id 之后获取帖子以继续分页,如下所示:

-M5HMJQh2gWuah7GSht
-M5HMJQlrcfTTF3fbbI
-M5HMJQo6QT1HwWP2lz
-M5HMJQrIUiZyzhiqK3
-M5HMJQudSkFdvs42D1
...

我尝试使用 startAt(ID) 但没有显示结果:

var starCountRef = firebase.database().ref('/posts/').limitToFirst(11).startAt(pageNumber);

任何想法如何在 firebase 中获取 id 后的帖子?

【问题讨论】:

  • 我认为你需要 3 个变量:第一个 n,第一个 n 的最后一个和下一个 n,它在前一个 n 的最后一个之后开始。

标签: javascript firebase firebase-realtime-database


【解决方案1】:

Firebase 实时数据库查询包括两个步骤:

  1. 您调用orderBy 方法之一来对特定值的子节点进行排序。
  2. 然后调用其中一种过滤方法(startAtendAtequalTo)来确定从哪里开始和停止返回数据。

您的代码执行了第二步,但未能执行第一步。这意味着您使用的是 Firebase 的默认排序顺序,即每个节点的优先级。优先级是那个时候遗留下来的,然后这个 API 没有更好的排序选项。这些天来,您总是希望在过滤之前致电orderBy...

有了这些知识,您获取第二页结果的查询应该类似于:

firebase.database()
  .ref('/posts/')
  .orderByKey()
  .startAt("-M5HMJQe319R19Cvak6")
  .limitToFirst(11)

我强烈建议将 "-M5HMJQe319R19Cvak6" 值称为 pagenumber 以外的其他值,因为该变量名称看起来好像 Firebase 查询是基于偏移量的,但实际上并非如此。

【讨论】:

  • 非常感谢!因为我想先显示新数据,所以我使用 endAt 和 limitToLast 代替!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多