简介
本文将介绍 VTable 的状态管理模块,以及管理模块内部的维护的管理类型。
状态管理模块
状态模块 StateManager负责管理表格的各个交互的状态,包括选中单元格、hover 高亮效果、菜单的显示效果等。
StateManager 中不仅维护了各个状态的值,同时还定义了更新各个状态的方法,当触发对应事件后,会去更新对应的状态。状态发生变化的时候会去更新场景树,重新渲染图表。
下面来重点讲下在 StateManager 中维护了哪些状态以及不同类型状态的应用场景。
状态类型枚举
interactionState: InteractionState; // 主交互状态 interactionStateBeforeScroll?: InteractionState; // 滚动前状态缓存
interactionState 表示表格当前所处的交互,目前有三种状态。
-
default // 默认空闲状态
-
grabing // 拖拽中
-
scrolling // 滚动中
通过 interactionState 的区分,能够避免表格的交互状态出现冲突。
select 单元格选择
select: { ranges: (CellRange & { skipBodyMerge?: boolean })[]; // 多选区范围 highlightScope: HighlightScope; // 高亮模式(单格/整行/整列/十字) cellPos: CellPosition; // 当前聚焦单元格 disableHeader?: boolean; // 禁用表头选中 disableCtrlMultiSelect?: boolean; // 禁用Ctrl多选 headerSelectMode?: 'inline' | 'cell' | 'body'; // 表头选择模式 highlightInRange?: boolean; // 范围内高亮 selecting: boolean; // 正在选择中标识 customSelectRanges?: { // 自定义样式选区 range: CellRange; style: CustomSelectionStyle; }[]; }
select 状态维护了当前选中单元格的位置与 select 交互的配置,包括 highlightInRange,disableHeader,headerSelectMode 等。
fillHandle
fillHandle: { direction?: 'top' | 'bottom' | 'left' | 'right'; // 拖拽方向 directionRow?: boolean; // 是否以行方向填充 isFilling: boolean; // 正在填充标识 startX: number; // 起始X坐标 startY: number; // 起始Y坐标 beforeFillMinCol?: number; // 填充前选区最小列 beforeFillMinRow?: number; // 填充前选区最小行 beforeFillMaxCol?: number; // 填充前选区最大列 beforeFillMaxRow?: number; // 填充前选区最大行 }
fillHandle 主要维护的是填充柄的状态,用于标识当前填充的方向以及起始位置等。
hover
hover: { highlightScope: HighlightScope; // 悬停高亮模式 disableHeader?: boolean; // 禁用表头悬停 cellPos: CellPosition; // 当前 hover 位置 cellPosContainHeader?: CellPosition; *// 记录当前hover的位置(在disableHeader时启用,记录真实位置)* }
hover 维护了当前鼠标悬停的单元格位置,以及 hover 相关的配置:highlightScope 、disableHeader。
columnResize
columnResize: { col: number; // 调整列索引 x: number; // 相对表格X坐标 resizing: boolean; // 调整列宽中的标记 isRightFrozen?: boolean; // 是否右侧冻结列 }
columnResize 维护了拖拽调整列宽的状态, resizing 字段来表示当前是否处于拖拽调整列宽的状态,而 col 记录了当前正在调整的列索引。
rowResize
rowResize: { row: number; // 调整行索引 */** y坐标是相对table内坐标 */* y: number; // 相对表格y坐标 resizing: boolean; // 调整行高中的标记 isBottomFrozen?: boolean; // 是否底部冻结列 };
相对的,rowResize 记录了拖拽调整行高的状态,row 为当前当前行的索引,y 为当前拖拽位置相对于 table 的y 坐标。
columnMove
columnMove: { colSource: number; // 原始列索引 colTarget: number; // 目标列索引 rowSource: number; // 原始行索引 rowTarget: number; // 目标行索引 x: number; // 当前X坐标 y: number; // 当前Y坐标 moving: boolean; // 移动进行中标识 }
拖拽列换位的状态维护在 columnRemove 中,内部记录了当前鼠标的坐标信息,以及起始行/列和目标行/列的信息。
menu
menu: { x: number; // 菜单显示X坐标 y: number; // 菜单显示Y坐标 isShow: boolean; // 显示状态 itemList: MenuListItem[]; // 菜单项列表 bounds: Bounds; // 菜单边界范围 highlightIndex: number; // 高亮项索引 dropDownMenuHighlight?: DropDownMenuHighlightInfo[]; // 子菜单高亮 }
menu 负责下拉菜单的信息,维护了菜单显示坐标、显示状态、菜单项、高亮子菜单的配置等信息。
sort
sort: Array<{ // 多列排序状态 col: number; // 排序列索引 row: number; // 排序列表头的行索引 field?: string; // 排序字段 order: SortOrder; // 排序方向 icon?: Icon; // 排序图标 }>;
VTable 内置的排序状态由 sort 进行维护,由于 VTable 中支持多列排序,所以该配置是一个数组。负责存储当前哪些列进行了排序,同时保存了关于排序的 icon 信息与排序方向。
frozen
frozen: { // 冻结状态 col: number; // 冻结列截止索引 icon?: Icon; // 冻结操作图标 };