无限滚动/数据分页和页面结果不同步

问题描述 投票:0回答:1

我即将在网络应用程序中开发项目的无限滚动(这只是分页项目的特定用户体验),但我有点困惑如何解决一个用户滚动/页面时添加新项目的问题通过项目。我们如何处理这种不同步的数据?

假设当我打开页面数据库时有 100 个项目。

  1. 用户 1 导航到请求前 10 项的页面并显示它们
  2. 用户 1 然后开始滚动并到达页面请求接下来 10 个项目的点
  3. 用户 2 添加了一个新项目,因此数据库现在有 101 个项目
  4. 用户 1 滚动请求接下来的 10 个项目。

后端应该发生什么?

  1. 如果用户向下滚动,我们可以从最后一个 ID 请求 10 个项目,这是可以的
  2. 如果用户向上滚动,我们会请求之前的 10 项,但现在顶部还有另一项?

这个问题怎么解决?也许甚至在 Stackexchange 网站上,当用户浏览问题页面时,内容会被分页并流缓存发生变化?

这个问题应该问程序员吗?我不确定...

pagination infinite-scroll
1个回答
0
投票

通过提供传统方式不进行分页,最容易解决这个问题

  • 页面索引和
  • 页面大小,

而是提供

  • 最后显示的记录ID
  • 页面大小

这称为键集分页键查找方法分页。两者通常都需要额外的参数,例如排序和过滤,但这两种技术都是相似的,因此与这个答案无关。

这可以防止在将新项目添加到列表顶部时返回无效页面,但它也有一个缺点,即无法跳转页面(即在我们查看第 5 页时获取第 10 页) 。但这就是为什么在特定场景中使用它的原因,例如无限滚动,在这种情况下,这个问题不存在,甚至不需要。

查看性能比较和有关 按键查找方法的大量解释
http://use-the-index-luke.com/sql/partial-results/fetch-next-page

所以基本上我们想要做的就是沿着这些思路做一些事情(假设我们按时间顺序以相反的顺序排序,并假设 CreateDate 具有如此高的精度,以至于它被认为是唯一的):

with LastRecord
as (
    select CreatedDate
    from Records
    where Id = @LastRecordId
)
select r.*
from Records r, LastRecord l
where r.CreatedDate < l.CreatedDate
offset 0 rows
fetch first @PageSize rows only;
© www.soinside.com 2019 - 2024. All rights reserved.