原生跨框架的表格组件,三步实现万条不卡

本文介绍了如何在一个原生跨框架的表格组件中实现万条数据不卡顿,主要分为数据驱动、差异化更新和虚拟滚动三个步骤。数据驱动通过对外提供数据变更接收函数实现视图和数据的隔离。差异化更新避免不必要的DOM操作,提高性能。虚拟滚动则通过仅渲染可视区域的数据,配合滚动事件和防抖机制,确保流畅体验。

确定在GridManager内实现万条不卡的想法,最早出现于2021年初同郑某人杨某人的饭局上。如今功能已经实现,整理下这个值得记录的过程。

现状分析

在虚拟滚动落地前,针对于现有逻辑的改造是个前置条件。

all.gif

上方gif内演示了在实现万条不卡前,表格组件所拥有的部分能力。由于这些能力搭建于原生跨框架的结构上,所以在需要对渲染逻辑进行较大范围改造时,原先的能力就成为了不小的包袱。

因此在不影响现有功能的情况下支持万条不卡,需要按序实现以下三个步骤:

  • tbody区域的数据驱动改造: 降低功能复杂度
  • 差异化更新: 减少DOM节点的更新频率
  • 虚拟滚动: 减少DOM节点的更新数量

三个步骤

基于数据驱动,构建差异化更新,最终实现虚拟滚动。

1、数据驱动

随着js框架的出现,数据驱动改变了前端组件的渲染逻辑。

对于一个脱离框架的原生表格组件,虽然需要自行实现数据驱动,但难度其实不大,只需将tbody区域内的所有渲染逻辑进行整合,并向外透出唯一的数据变更接收函数。

<
如果您要处理用大量的比如说:一百个数据项(例如,收件箱里的邮件列表)的列表(译注:本文将items译为数据项),过滤、查找、分类,以及其它分组功能将很快变得困难而单调乏味。特别是排序和分组大大提高了一个列表中数据项的结构,默认情况下,这是我想要应用到我的所有列表的功能特性。特别情况下,我还会寻找一个允许将相似的项一起安排和分组列表/网格的控件,很像在Outlook 2003中使用的网格(或列表?)。 我知道这里有一些支持这类功能的商业列表/网格(控件);然而,在试用它们的时候我也遇到过若干bug。能访问源代码(译注:因为商业目的)使得这非常令人沮丧,因此我想倒如我写篇CodeProject文章,看看我是否可以拿出一个自定义解决方案。 因为网格比列表更加灵活,我决定实现一个可以一起分组的网格控件,正如Outlook一样。这个控件用C#2.0在VS 2005上实现的。现在,我能保证这个实现没有bug,但至少它是免费的,并且它有源代码。因而,您可以根据您的需要修改它们,以适合于您自己的用途。无论如何要注意:这个控件并没有完成!一些功能也许能正确地工作或完全能工作。该控件主要关注于排序、分组并在网格上显示数据项,这些功能特性我想已做得相当地好了。在网格中插入、更新和删除行及单元格在我考虑的范围之内。 在这篇文章中,我将解释这个控件怎么用,和它能做什么,并且也包含了什么它能做,主要把焦点集中在只想要按现在的样子复用该控件的开发组。然后,对于为了他们自己的用途想要扩展或改变这个控件的实现的开发者,我将对这个控件内部运作做一点更为详细的解释。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值