目录
虚拟滚动
现实世界的例子
服务设置
组件设置
结论
首页 web前端 css教程 使用 Angular 实现几乎无限滚动

使用 Angular 实现几乎无限滚动

Jan 07, 2025 pm 08:15 PM

无限滚动已经存在了一段时间了。 基本思想:当您滚动时,新内容会在底部加载,从而创建看似无穷无尽的滚动。 实现起来很简单,但如果没有仔细规划,性能就会受到影响。 经过几次内容重新获取后,您可能会拥有数百个 DOM 元素,其中许多元素是不可见的。 幸运的是,存在一些模式可以缓解这种情况,我们将使用 Angular 来探索一种模式。

Virtually Infinite Scrolling with Angular

这是我们想要避免的。

虚拟滚动

虚拟滚动在任何时候仅渲染大列表的子集——与无限滚动不同。 它非常适合一次性渲染所有内容效率低下的大型数据集。 仅渲染可见(和近乎可见)的项目;当用户滚动时,项目会动态交换。 这显着减少了 DOM 元素,从而提高了性能。

虚拟滚动通过创建与视口高度匹配的容器来工作。 只有可见项目(加上缓冲区)才会在此容器中以特定的滚动深度呈现,并通过 CSS 进行管理。 滚动更新容器,显示新项目并删除视图之外的项目,调整滚动深度。 将此与无限滚动相结合,创建一个几乎无限的列表,而不会造成性能损失。

下面的示例显示了包含数千个项目的列表,但一次最多渲染 8 个。 滚动会调整 CSS 滚动高度,产生列表更长的错觉。

Virtually Infinite Scrolling with Angular

现实世界的例子

让我们构建一个 Angular 应用程序,从 Reddit 的分页 API 获取媒体并将其显示在虚拟滚动列表中。 它将包括一个用于子 Reddit 选择的搜索栏和一个过滤器。 向下滚动可加载更多内容。 我们的关键要求:

  1. 由 RxJS Observables 和异步管道驱动。
  2. 在 subreddit 或过滤器更改时重置内容,但不会在附加新内容时重置内容。
  3. 将以前的内容存储在内存中,以便无缝向上/向下滚动,无需多余的 API 调用。

我们将使用 @angular/cdk 包(包含 Virtual Scroller 组件)。使用npm i @angular/cdk安装它。

虽然此示例使用 Angular,但类似的模式也适用于 React、Vue 或 vanilla JavaScript。 此处提供了说明基本原理的基本演示。

服务设置

首先,我们创建一个服务,使用 Angular 的 HttpClient 和 RxJS Observables 从 Reddit API 获取内容来管理 subreddit 名称和过滤器。 (为简洁起见,省略了一些代码;完整的实现在这里)。

// ... (Omitted for brevity) ...
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

内容获取方法在数据请求期间跟踪特定属性。 page 属性被添加到查询字符串中,以确保在最后一项之后获取新内容。 我们还过滤掉 NSFW 内容和缺少帖子提示的项目。这可确保仅显示预期的内容。

// ... (Omitted for brevity) ...
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

query$ observable(之前被省略)在获取内容之前合并不同的 observable 流。 scan 运算符结合了先前和当前的流结果,构建跨多个页面的大型数据数组。

这允许广泛滚动;只有 subreddit 名称或过滤器更改才会触发完整的重新获取。 nextPagequery$ 的属性,存储当前集合中的最后一个项目 ID,用于确定在接近虚拟滚动条底部时要获取的下一页。

// ... (Omitted for brevity) ...
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

RxJS 的强大之处在于组合和操作数据流。这使我们能够在业务逻辑到达组件之前对其进行处理,从而使组件保持清洁和可重用。

组件设置

接下来,我们使用 Angular 的 CdkVirtualScrollViewport 设置组件来显示内容。 一个方法处理视口底部附近的滚动,通过 subRedditPage$ observable 获取下一页。

// ... (Omitted for brevity) ...
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

模板使用异步管道订阅query$。 注意:随着内容高度可变,虚拟滚动条变得更加复杂;为了提高性能,建议使用一致的物品高度。

// ... (Omitted for brevity) ...
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

当用户接近底部时,onScroll 方法会获取更多内容。它使用 nextPage ID(来自 query$)并发送到 subRedditPage$,触发下一个 API 调用并通过 query$ 更新列表。

// ... (Omitted for brevity) ...
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

搜索栏和选项卡控件也集成在一起(下面的简化示例)。

// ... (Omitted for brevity) ...
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

结论

这会创建一个几乎无限的滚动条。 您可以在此处进行测试。 Reddit 的 API 有速率限制;你可能会在测试过程中碰到它们。 有关更多详细信息,包括其他功能,请参阅 GitHub 存储库此处

以上是使用 Angular 实现几乎无限滚动的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1653
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1251
29
C# 教程
1224
24
Google字体可变字体 Google字体可变字体 Apr 09, 2025 am 10:42 AM

我看到Google字体推出了新设计(Tweet)。与上一次大型重新设计相比,这感觉更加迭代。我几乎无法分辨出区别

如何使用HTML,CSS和JavaScript创建动画倒计时计时器 如何使用HTML,CSS和JavaScript创建动画倒计时计时器 Apr 11, 2025 am 11:29 AM

您是否曾经在项目上需要一个倒计时计时器?对于这样的东西,可以自然访问插件,但实际上更多

HTML数据属性指南 HTML数据属性指南 Apr 11, 2025 am 11:50 AM

您想了解的有关HTML,CSS和JavaScript中数据属性的所有信息。

如何通过CSS选择第一个类名为item的子元素? 如何通过CSS选择第一个类名为item的子元素? Apr 05, 2025 pm 11:24 PM

在元素个数不固定的情况下如何通过CSS选择第一个指定类名的子元素在处理HTML结构时,常常会遇到元素个数不�...

为什么Flex布局中的紫色斜线区域会被误认为是'溢出空间”? 为什么Flex布局中的紫色斜线区域会被误认为是'溢出空间”? Apr 05, 2025 pm 05:51 PM

关于Flex布局中紫色斜线区域的疑问在使用Flex布局时,你可能会遇到一些令人困惑的现象,比如在开发者工具(d...

使Sass更快的概念证明 使Sass更快的概念证明 Apr 16, 2025 am 10:38 AM

在一个新项目开始时,Sass汇编发生在眼睛的眨眼中。感觉很棒,尤其是当它与browsersync配对时,它重新加载

在前端开发中,如何使用CSS和JavaScript实现类似Windows 10设置界面的探照灯效果? 在前端开发中,如何使用CSS和JavaScript实现类似Windows 10设置界面的探照灯效果? Apr 05, 2025 pm 10:21 PM

在前端开发中如何实现类似Windows...

我们如何创建一个在SVG中生成格子呢模式的静态站点 我们如何创建一个在SVG中生成格子呢模式的静态站点 Apr 09, 2025 am 11:29 AM

格子呢是一块图案布,通常与苏格兰有关,尤其是他们时尚的苏格兰语。在Tar​​tanify.com上,我们收集了5,000多个格子呢

See all articles