Angular Material 踩坑之 —— Infinite / Virtual Scroll

本文详细介绍了Angular Material中实现Material Design的Angular组件库,并重点讨论了VirtualScroll特性,即如何通过'cdk-virtual-scroll-viewport'实现数据虚拟化。然而,当遇到表格复杂性增加,如使用'sticky'属性时,VirtualScroll可能出现滚动异常问题。作者指出,Angular的VirtualScrollStrategy在处理滚动方向时存在缺陷,导致滚动不顺畅。虽然推荐使用ng-table-virtual-scroll等第三方解决方案,但对复杂表格仍建议使用分页以确保稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 由Google推出的Material Design,在Angular世界的实现也是由Angular 团队实现和维护的https://github.com/angular/componentshttps://github.com/angular/componentsAngular Material UI component libraryUI component infrastructure and Material Design components for mobile and desktop Angular web applications.https://material.angular.io/

但是,它并不完善,比如今天要说的虚拟化,或者叫Virtual Scroll,官方给出的解决办法是"cdk-virtual-scroll-viewport",他会创建一个wrapper来包裹实际滚动的界面部分,和一个spacer来撑大整个viewport的区域,告诉滚动条,实际数据有多长。

整个设计很巧妙的使用了“position: absolute” 这个特性,保证spacer老实的躺在旁边当标尺,而wrapper可以丝滑的在spacer旁边滚动,这样就不需要加载全部数据,而是根据你滚动的位置,动态的加载数据。

这时候就有一个矛盾是每一行的高度只能是固定的,否则viewport算不出来该显示哪些?但是Angular给出了自定义的方式:VirtualScrollStrategy,用户可以自定义自己的逻辑来确定哪些需要显示,而这个官方推荐了第三方的实现:https://github.com/diprokon/ng-table-virtual-scrollhttps://github.com/diprokon/ng-table-virtual-scroll当滚动条滚动的时候,会触发VirtualScrollStrategy的onContentScroll方法,

(https://github.com/angular/components/blob/master/src/cdk/scrolling/virtual-scroll-viewport.ts)

在这个方法中,会去viewport中获取当前的scroll position,利用当前的位置和上一次的位置,判断滚动方向,以及是否需要加载新的数据刷新视图。

整个实现在普通的table中运行的非常良好,但是,当table变得复杂的时候,会出现上下不停跳的情况(比如当前几列固定位置,使用sticky属性时)。

这时,当VirtualScrollStrategy收到scroll通知时,它从viewport中获取的scroll position并不正确,例如,当你一直向下滚动时,会在中间穿插若干向上滚动的事件,由于Angular Material没有给滚动方向,只能单纯的凭借本地的scroll position和上次的对比来决定滚动方向,所以这个问题目前无法修复。只能寄希望于Angular团队修复他们的滚动的问题。

最后,仍然是推荐使用这个包,但是仅仅对于简单的table而言,对于复杂的table还是使用分页比较保险。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值