开篇
常用的表格组件库都是基于 DOM 去实现,很少会有基于 Canvas 去渲染的表格组件库。而 @Visactor/VTable 提供了基于 Canvas 渲染的表格组件库。本篇将从各种功能和交互的实现入手,来看下 ListTable 是如何去依靠 Canvas 提供的能力去实现类似原生 DOM 的操作的。
ListTable 外部依赖
在对 ListTable 进行细节分析前,有必要先提下 ListTable 的外部依赖 VRender。VRender 是由 ByteDance 提供的一款可视化引擎,通过将 Canvas 的渲染图形的过程抽象成 Group 和 Stage 进行管理,可以通过配置的形式在 Canvas 内部快捷的生成不同的图元。Group 可以理解成多个图元 的组,Stage 则对所有图元和 Group 进行管理,在下文中会经常提到这两个部分。
ListTable 架构
首先来了解下大致的架构,ListTable 基本架构可以划分为下面几个模块
-
渲染引擎:Scenegraph 场景树。表头的移动、图形渲染、单元格宽高计算等都包含在场景树中;
-
渐进式生成:SceneProxy 模块是 Scenegraph 下的一个子模块,定义了场景树初始化的生成、维护场景树在初始化时生成的最大行列值、同时负责滚动渐进渲染的逻辑;
-
状态管理:StateManager 处理表格状态,hover、select 在 ListTable 都是以数据的形式存在的,在 state 发生改变的时候,会去触发 Scenegraph 重新渲染图表;
-
事件系统:EventManager/EventHandler 处理交互事件;
-
布局管理:LayoutMap 表格核心布局模块。通过配置生成行列表头、维护单元格信息;包括树形表格、多级表头的信息计算,都是在 Layout 中;
-
布局计算:通过 colWidthsMap/rowHeightsMap 维护行列宽高数据;
-
样式系统:通过 theme/style 相关模块管理样式;
-
数据管理:通过 DataSource 实现对 records 的托管,包括数据的增删改查、排序、聚合等逻辑处理;