stk-table-vue 1.2.3 → 1.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/{Dropdown-B2dzC5D3.js → Dropdown-C4c7Nmgf.js} +2 -2
- package/lib/{StkTable-DFh1B-f9.js → StkTable-CzktjLlV.js} +75 -9
- package/lib/src/StkTable/StkTable.vue.d.ts +18 -4
- package/lib/src/StkTable/features/useAreaSelection.d.ts +12 -2
- package/lib/src/StkTable/types/index.d.ts +4 -1
- package/lib/src/StkTable/useTableColumns.d.ts +11 -0
- package/lib/src/StkTable/useVirtualScroll.d.ts +6 -1
- package/lib/stk-table-vue.js +3 -3
- package/lib/style.css +1 -1
- package/package.json +1 -1
- package/src/StkTable/StkTable.vue +54 -3
- package/src/StkTable/features/useAreaSelection.ts +13 -2
- package/src/StkTable/types/index.ts +4 -1
- package/src/StkTable/useTableColumns.ts +11 -0
- package/src/StkTable/useVirtualScroll.ts +10 -4
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* name: stk-table-vue
|
|
3
|
-
* version: v1.2.
|
|
3
|
+
* version: v1.2.5
|
|
4
4
|
* description: High performance realtime virtual table for vue3 and vue2.7
|
|
5
5
|
* author: japlus
|
|
6
6
|
* homepage: https://ja-plus.github.io/stk-table-vue/
|
|
7
7
|
* license: MIT
|
|
8
8
|
*/
|
|
9
|
-
import { t as StkTable_default } from "./StkTable-
|
|
9
|
+
import { t as StkTable_default } from "./StkTable-CzktjLlV.js";
|
|
10
10
|
import { createElementBlock, createElementVNode, createVNode, defineComponent, h, nextTick, normalizeClass, normalizeStyle, onMounted, onUnmounted, openBlock, reactive, ref, withModifiers } from "vue";
|
|
11
11
|
//#region src/StkTable/custom-cells/FilterCell/Dropdown/index.vue?vue&type=script&setup=true&lang.ts
|
|
12
12
|
var DROPDOWN_DEFAULT_WIDTH = 300;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* name: stk-table-vue
|
|
3
|
-
* version: v1.2.
|
|
3
|
+
* version: v1.2.5
|
|
4
4
|
* description: High performance realtime virtual table for vue3 and vue2.7
|
|
5
5
|
* author: japlus
|
|
6
6
|
* homepage: https://ja-plus.github.io/stk-table-vue/
|
|
@@ -323,9 +323,19 @@ var MY_FN_NAME = "stkName";
|
|
|
323
323
|
//#endregion
|
|
324
324
|
//#region src/StkTable/features/useAreaSelection.ts
|
|
325
325
|
/**
|
|
326
|
-
*
|
|
327
|
-
*
|
|
326
|
+
* 单元格区域选择功能(Excel 式交互)。
|
|
327
|
+
* 支持鼠标拖拽选择、键盘导航(方向键/Tab/Shift+Tab,Ctrl 多选、Shift 扩选)、复制到剪贴板。
|
|
328
328
|
* en: Cell area selection feature with mouse drag, keyboard navigation, copy-paste, etc.
|
|
329
|
+
*
|
|
330
|
+
* 分区说明:
|
|
331
|
+
* - 选区状态:锚点 begin / 终点 end、选区集合、是否正在拖拽选中(isAreaSelecting)。
|
|
332
|
+
* - 鼠标交互:mousedown 起锚、mousemove 扩展选区、拖拽靠近容器边缘时自动滚动(EDGE_ZONE/SCROLL_SPEED_MAX)。
|
|
333
|
+
* - 键盘交互:方向键/Tab 移动选区(见 useKeyboardArrowScroll 联动)、Ctrl 切换多选、Shift 扩选。
|
|
334
|
+
* - 复制:通过 formatCellForClipboard 回调(若配置了 customCell 应自定义)生成剪贴板文本。
|
|
335
|
+
* - 选区转换:单元格的可见/数据坐标通过 getRowIndex/getColumnIndex、cellKeyGen/colKeyGen 与
|
|
336
|
+
* 虚拟滚动(虚拟窗口裁剪)和列宽缓存(getCalculatedColWidth)相互换算。
|
|
337
|
+
*
|
|
338
|
+
* 对外返回:选区配置/状态、选区范围读写(setAreaSelection/getAreaSelection)、复制处理、选择/取消等。
|
|
329
339
|
*/
|
|
330
340
|
function useAreaSelectionImpl(props, emits, tableContainerRef, dataSourceCopy, tableHeaderLast, colKeyGen, cellKeyGen, scrollTo, virtualScroll, virtualScrollX, getRowIndex, getColumnIndex) {
|
|
331
341
|
/**
|
|
@@ -3039,6 +3049,17 @@ function useSorter(props, emits, colKeyGen, tableHeaderLast, dataSourceCopy, ini
|
|
|
3039
3049
|
/**
|
|
3040
3050
|
* Table Columns Processing Hook
|
|
3041
3051
|
* Handles multi-level header processing and column flattening
|
|
3052
|
+
*
|
|
3053
|
+
* 核心职责:
|
|
3054
|
+
* - 将用户传入的 `columns`(可能含 children 多级表头)摊平为「按层级划分」的二维数组 `tableHeaders`,
|
|
3055
|
+
* 每层是同一行的 th 集合;同时生成 `tableHeadersForCalc`(复制 rowSpan 位置)用于固定列计算。
|
|
3056
|
+
* - 为每个列补充私有元数据(@private 字段):
|
|
3057
|
+
* - __P__ 父列引用(双向链表)
|
|
3058
|
+
* - __LF_S__ / __LF_E__ 该列在叶子列中的起止索引,用于多级表头横向虚拟滚动
|
|
3059
|
+
* - __W__ 计算宽度(子列累加 / 叶子列取配置宽度)
|
|
3060
|
+
* - __R_SP__ / __C_SP__ th 的 rowSpan / colSpan
|
|
3061
|
+
* - 在 relative 模式(isRelativeMode)下,固定列不再用 sticky,而是重排到左右两侧。
|
|
3062
|
+
* - 叶子列宽度是 X 轴虚拟滚动的依据(getColWidth)。
|
|
3042
3063
|
*/
|
|
3043
3064
|
function useTableColumns(virtualX, isRelativeMode) {
|
|
3044
3065
|
/**
|
|
@@ -3717,7 +3738,7 @@ function useVirtualScroll(props, tableContainerRef, trRef, dataSourceCopy, table
|
|
|
3717
3738
|
return (dataSourceCopyValue.length - startIndex - virtual_dataSourcePart.value.length) * rowHeight;
|
|
3718
3739
|
});
|
|
3719
3740
|
const virtualX_on = computed(() => {
|
|
3720
|
-
return props.virtualX && tableHeaderLast.value.reduce((sum, col) => sum += getCalculatedColWidth(col), 0) > virtualScrollX.value.containerWidth
|
|
3741
|
+
return props.virtualX && tableHeaderLast.value.reduce((sum, col) => sum += getCalculatedColWidth(col), 0) > virtualScrollX.value.containerWidth;
|
|
3721
3742
|
});
|
|
3722
3743
|
/** 是否多级表头 */
|
|
3723
3744
|
const isMultiLevelHeader = computed(() => tableHeaders.value.length > 1);
|
|
@@ -4072,6 +4093,7 @@ function useVirtualScroll(props, tableContainerRef, trRef, dataSourceCopy, table
|
|
|
4072
4093
|
/** fix: 滚动条不在顶部时,表格数据变少,导致滚动条位置有误 */
|
|
4073
4094
|
scrollTop = maxScrollTop;
|
|
4074
4095
|
assignVs(virtualScroll, {
|
|
4096
|
+
rowHeight,
|
|
4075
4097
|
containerHeight,
|
|
4076
4098
|
pageSize,
|
|
4077
4099
|
scrollHeight
|
|
@@ -4654,6 +4676,36 @@ var StkTable_default = /* @__PURE__ */ defineComponent({
|
|
|
4654
4676
|
],
|
|
4655
4677
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
4656
4678
|
/**
|
|
4679
|
+
* StkTable 主组件(Vue 3 / Vue 2.7)
|
|
4680
|
+
*
|
|
4681
|
+
* 这是一个超大的核心组件文件,约 1800+ 行。理解它时请按以下「分区地图」定位:
|
|
4682
|
+
*
|
|
4683
|
+
* 1. 顶部(template 261 行前)
|
|
4684
|
+
* 渲染结构:滚动容器 + 原生 <table>。包括 colgroup(固定模式列宽)、thead(多级表头、
|
|
4685
|
+
* sticky 固定)、tbody(虚拟滚动 tr / 空 td 定位)、tfoot(汇总行)、自定义滚动条容器。
|
|
4686
|
+
* 通过 CSS 类(如 virtual / virtual-x / area-selection / theme 等)联动对应 hook 状态。
|
|
4687
|
+
*
|
|
4688
|
+
* 2. script setup(270 行起)
|
|
4689
|
+
* - props 定义:全部配置项,即公共 API(对应 types/index.ts 与文档 table-props.md)。
|
|
4690
|
+
* - 大量 useXxx hooks 的组装:本文件只做「装配」,具体逻辑在对应 hook 中。
|
|
4691
|
+
*
|
|
4692
|
+
* 3. 核心 hook 与职责(均在 src/StkTable/use*.ts):
|
|
4693
|
+
* - useVirtualScroll XY 轴虚拟滚动(可视区裁剪、占位 tr/th 定位、scroll 计算)
|
|
4694
|
+
* - useTableColumns 列配置归一化 / 多级表头展开为叶子列
|
|
4695
|
+
* - useFixedCol/useFixedStyle/getFixedColPosition 固定列 sticky/relative 定位
|
|
4696
|
+
* - useSorter/useTableColumns.sort 排序(本地/远端、多列)
|
|
4697
|
+
* - useColResize/useThDrag/useTrDrag 列宽调整 / 表头拖拽 / 行拖拽
|
|
4698
|
+
* - useMergeCells/useMaxRowSpan 单元格合并与最大行跨
|
|
4699
|
+
* - useRowExpand/useTree 展开行 / 树形
|
|
4700
|
+
* - useHighlight 单元格/行高亮(Web Animations API 或 css)
|
|
4701
|
+
* - useAreaSelection (features/) 区域选取(Excel 式键盘操作)
|
|
4702
|
+
* - useScrollbar/useScrollRowByRow/useWheeling 自定义滚动条 / 按行滚动 / 滚轮
|
|
4703
|
+
* - useAutoResize 容器尺寸自动适配
|
|
4704
|
+
*
|
|
4705
|
+
* 4. expose:对外暴露的实例方法(对应文档 expose.md),供 ref 调用。
|
|
4706
|
+
*
|
|
4707
|
+
* 注意:此文件与 vue2.7 兼容,props 不可抽离到独立文件(见下方注释),修改时注意不要破坏兼容性。
|
|
4708
|
+
*
|
|
4657
4709
|
* @author japlus
|
|
4658
4710
|
*/
|
|
4659
4711
|
const stkTableId = createStkTableId();
|
|
@@ -4902,7 +4954,21 @@ var StkTable_default = /* @__PURE__ */ defineComponent({
|
|
|
4902
4954
|
watch(() => props.virtual, () => {
|
|
4903
4955
|
nextTick(initVirtualScrollY);
|
|
4904
4956
|
});
|
|
4905
|
-
|
|
4957
|
+
/**
|
|
4958
|
+
* 行高类配置变化后重算虚拟滚动几何。
|
|
4959
|
+
* 合并为一个 watcher:同一 tick 内多项同时变化只重算一次。
|
|
4960
|
+
* 必须无参调用 initVirtualScrollY(其首参是虚拟滚动容器高度,不能把行高值传入),
|
|
4961
|
+
* 且需 nextTick 等新的 --row-height / 表头行高等样式应用到 DOM 后再测量。
|
|
4962
|
+
*
|
|
4963
|
+
* 监听值拼接为单个原始值(字符串)而非返回数组:getter 返回数组时每次求值都是新数组,
|
|
4964
|
+
* 身份比较必然变化,父组件传入内联对象字面量(如 :expand-config="{ height: 40 }",官方示例即如此写法)
|
|
4965
|
+
* 会让本 watcher 在父组件每次重渲染时误触发;展开行/变高大表下误触发一次会连带行高树 O(n) 重建
|
|
4966
|
+
* (实测 50K 行每次父重渲染多付 ~10ms)。拼接为原始值后仅在值真正变化时触发,且兼容 Vue 2.7。
|
|
4967
|
+
*/
|
|
4968
|
+
watch(() => {
|
|
4969
|
+
var _props$expandConfig;
|
|
4970
|
+
return `${props.rowHeight}|${props.headerRowHeight}|${props.footerRowHeight}|${(_props$expandConfig = props.expandConfig) === null || _props$expandConfig === void 0 ? void 0 : _props$expandConfig.height}`;
|
|
4971
|
+
}, () => nextTick(initVirtualScrollY));
|
|
4906
4972
|
watch(() => props.virtualX, () => {
|
|
4907
4973
|
handleDealColumns();
|
|
4908
4974
|
nextTick(() => {
|
|
@@ -5117,7 +5183,7 @@ var StkTable_default = /* @__PURE__ */ defineComponent({
|
|
|
5117
5183
|
return col.title || "";
|
|
5118
5184
|
}
|
|
5119
5185
|
function getTRProps(row, index) {
|
|
5120
|
-
var _props$
|
|
5186
|
+
var _props$expandConfig2;
|
|
5121
5187
|
const rowIndex = getAbsoluteRowIndex(index);
|
|
5122
5188
|
const rowKey = rowKeyGen(row);
|
|
5123
5189
|
const classList = [
|
|
@@ -5134,9 +5200,9 @@ var StkTable_default = /* @__PURE__ */ defineComponent({
|
|
|
5134
5200
|
class: classList.filter(Boolean).join(" "),
|
|
5135
5201
|
style: null
|
|
5136
5202
|
};
|
|
5137
|
-
if ((row === null || row === void 0 ? void 0 : row.__EXP_R__) && props.virtual && ((_props$
|
|
5138
|
-
var _props$
|
|
5139
|
-
result.style = `--row-height: ${(_props$
|
|
5203
|
+
if ((row === null || row === void 0 ? void 0 : row.__EXP_R__) && props.virtual && ((_props$expandConfig2 = props.expandConfig) === null || _props$expandConfig2 === void 0 ? void 0 : _props$expandConfig2.height)) {
|
|
5204
|
+
var _props$expandConfig3;
|
|
5205
|
+
result.style = `--row-height: ${(_props$expandConfig3 = props.expandConfig) === null || _props$expandConfig3 === void 0 ? void 0 : _props$expandConfig3.height}px`;
|
|
5140
5206
|
}
|
|
5141
5207
|
return result;
|
|
5142
5208
|
}
|
|
@@ -20,6 +20,7 @@ declare const _default: __VLS_WithTemplateSlots<import('vue').DefineComponent<im
|
|
|
20
20
|
/**
|
|
21
21
|
* 行高
|
|
22
22
|
* - `props.autoRowHeight` 为 `true` 时,将表示为期望行高,用于计算。不再影响实际行高。
|
|
23
|
+
* - 支持动态修改,修改后自动重算可视区行数与滚动高度,并与 `--row-height` 保持同步。
|
|
23
24
|
*/
|
|
24
25
|
rowHeight?: number;
|
|
25
26
|
/**
|
|
@@ -35,9 +36,15 @@ declare const _default: __VLS_WithTemplateSlots<import('vue').DefineComponent<im
|
|
|
35
36
|
* @deprecated
|
|
36
37
|
*/
|
|
37
38
|
rowCurrentRevokable?: boolean;
|
|
38
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* 表头行高。default = rowHeight
|
|
41
|
+
* - 支持动态修改,表头占用的表体行数(pageSize)随之重算。
|
|
42
|
+
*/
|
|
39
43
|
headerRowHeight?: number | string;
|
|
40
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* 表尾行高。default = rowHeight
|
|
46
|
+
* - 支持动态修改。表尾行悬浮于滚动区底部,不计入虚拟滚动的总高度。
|
|
47
|
+
*/
|
|
41
48
|
footerRowHeight?: number | string;
|
|
42
49
|
/** 虚拟滚动 */
|
|
43
50
|
virtual?: boolean;
|
|
@@ -510,6 +517,7 @@ declare const _default: __VLS_WithTemplateSlots<import('vue').DefineComponent<im
|
|
|
510
517
|
/**
|
|
511
518
|
* 行高
|
|
512
519
|
* - `props.autoRowHeight` 为 `true` 时,将表示为期望行高,用于计算。不再影响实际行高。
|
|
520
|
+
* - 支持动态修改,修改后自动重算可视区行数与滚动高度,并与 `--row-height` 保持同步。
|
|
513
521
|
*/
|
|
514
522
|
rowHeight?: number;
|
|
515
523
|
/**
|
|
@@ -525,9 +533,15 @@ declare const _default: __VLS_WithTemplateSlots<import('vue').DefineComponent<im
|
|
|
525
533
|
* @deprecated
|
|
526
534
|
*/
|
|
527
535
|
rowCurrentRevokable?: boolean;
|
|
528
|
-
/**
|
|
536
|
+
/**
|
|
537
|
+
* 表头行高。default = rowHeight
|
|
538
|
+
* - 支持动态修改,表头占用的表体行数(pageSize)随之重算。
|
|
539
|
+
*/
|
|
529
540
|
headerRowHeight?: number | string;
|
|
530
|
-
/**
|
|
541
|
+
/**
|
|
542
|
+
* 表尾行高。default = rowHeight
|
|
543
|
+
* - 支持动态修改。表尾行悬浮于滚动区底部,不计入虚拟滚动的总高度。
|
|
544
|
+
*/
|
|
531
545
|
footerRowHeight?: number | string;
|
|
532
546
|
/** 虚拟滚动 */
|
|
533
547
|
virtual?: boolean;
|
|
@@ -3,9 +3,19 @@ import { AreaSelectionConfig, AreaSelectionRange, CellKeyGen, ColKeyGen, StkTabl
|
|
|
3
3
|
import { VirtualScrollStore, VirtualScrollXStore } from '../useVirtualScroll';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* 单元格区域选择功能(Excel 式交互)。
|
|
7
|
+
* 支持鼠标拖拽选择、键盘导航(方向键/Tab/Shift+Tab,Ctrl 多选、Shift 扩选)、复制到剪贴板。
|
|
8
8
|
* en: Cell area selection feature with mouse drag, keyboard navigation, copy-paste, etc.
|
|
9
|
+
*
|
|
10
|
+
* 分区说明:
|
|
11
|
+
* - 选区状态:锚点 begin / 终点 end、选区集合、是否正在拖拽选中(isAreaSelecting)。
|
|
12
|
+
* - 鼠标交互:mousedown 起锚、mousemove 扩展选区、拖拽靠近容器边缘时自动滚动(EDGE_ZONE/SCROLL_SPEED_MAX)。
|
|
13
|
+
* - 键盘交互:方向键/Tab 移动选区(见 useKeyboardArrowScroll 联动)、Ctrl 切换多选、Shift 扩选。
|
|
14
|
+
* - 复制:通过 formatCellForClipboard 回调(若配置了 customCell 应自定义)生成剪贴板文本。
|
|
15
|
+
* - 选区转换:单元格的可见/数据坐标通过 getRowIndex/getColumnIndex、cellKeyGen/colKeyGen 与
|
|
16
|
+
* 虚拟滚动(虚拟窗口裁剪)和列宽缓存(getCalculatedColWidth)相互换算。
|
|
17
|
+
*
|
|
18
|
+
* 对外返回:选区配置/状态、选区范围读写(setAreaSelection/getAreaSelection)、复制处理、选择/取消等。
|
|
9
19
|
*/
|
|
10
20
|
declare function useAreaSelectionImpl<DT extends Record<string, any>>(props: any, emits: any, tableContainerRef: Ref<HTMLDivElement | undefined>, dataSourceCopy: ShallowRef<DT[]>, tableHeaderLast: ShallowRef<StkTableColumn<DT>[]>, colKeyGen: ColKeyGen, cellKeyGen: CellKeyGen, scrollTo: (top: number | null, left: number | null) => void, virtualScroll: Ref<VirtualScrollStore>, virtualScrollX: Ref<VirtualScrollXStore>, getRowIndex: (row: DT) => number, getColumnIndex: (col: StkTableColumn<DT>) => number): {
|
|
11
21
|
config: import('vue').ComputedRef<AreaSelectionConfig>;
|
|
@@ -297,7 +297,10 @@ export type SeqConfig = {
|
|
|
297
297
|
};
|
|
298
298
|
/** Configuration options for the expand column */
|
|
299
299
|
export type ExpandConfig = {
|
|
300
|
-
/**
|
|
300
|
+
/**
|
|
301
|
+
* worked in virtual mode
|
|
302
|
+
* 展开行的行高,支持动态修改(修改后行高累计与虚拟滚动会一同重算)
|
|
303
|
+
*/
|
|
301
304
|
height?: number;
|
|
302
305
|
};
|
|
303
306
|
/** drag row config */
|
|
@@ -4,5 +4,16 @@ import { PrivateRowDT, PrivateStkTableColumn, StkTableColumn } from './types';
|
|
|
4
4
|
/**
|
|
5
5
|
* Table Columns Processing Hook
|
|
6
6
|
* Handles multi-level header processing and column flattening
|
|
7
|
+
*
|
|
8
|
+
* 核心职责:
|
|
9
|
+
* - 将用户传入的 `columns`(可能含 children 多级表头)摊平为「按层级划分」的二维数组 `tableHeaders`,
|
|
10
|
+
* 每层是同一行的 th 集合;同时生成 `tableHeadersForCalc`(复制 rowSpan 位置)用于固定列计算。
|
|
11
|
+
* - 为每个列补充私有元数据(@private 字段):
|
|
12
|
+
* - __P__ 父列引用(双向链表)
|
|
13
|
+
* - __LF_S__ / __LF_E__ 该列在叶子列中的起止索引,用于多级表头横向虚拟滚动
|
|
14
|
+
* - __W__ 计算宽度(子列累加 / 叶子列取配置宽度)
|
|
15
|
+
* - __R_SP__ / __C_SP__ th 的 rowSpan / colSpan
|
|
16
|
+
* - 在 relative 模式(isRelativeMode)下,固定列不再用 sticky,而是重排到左右两侧。
|
|
17
|
+
* - 叶子列宽度是 X 轴虚拟滚动的依据(getColWidth)。
|
|
7
18
|
*/
|
|
8
19
|
export declare function useTableColumns<DT extends Record<string, any>>(virtualX: boolean, isRelativeMode: Ref<boolean>): readonly [import('vue').ShallowRef<PrivateStkTableColumn<PrivateRowDT>[][], PrivateStkTableColumn<PrivateRowDT>[][]>, import('vue').ShallowRef<PrivateStkTableColumn<PrivateRowDT>[][], PrivateStkTableColumn<PrivateRowDT>[][]>, (columns: StkTableColumn<DT>[]) => void];
|
|
@@ -13,7 +13,12 @@ export type VirtualScrollStore = {
|
|
|
13
13
|
startIndex: number;
|
|
14
14
|
/** 数组结束位置 */
|
|
15
15
|
endIndex: number;
|
|
16
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* 基准行高(px)。
|
|
18
|
+
* 由 initVirtualScrollY 随 props.rowHeight 同步(模板中的 --row-height 亦取此值,二者同源),
|
|
19
|
+
* 因此行高配置动态变化后此处不会是旧快照。
|
|
20
|
+
* 仅记录统一基准行高:变高模式(autoRowHeight)与展开行的行级高度不写入此字段。
|
|
21
|
+
*/
|
|
17
22
|
rowHeight: number;
|
|
18
23
|
/** 表格定位上边距 */
|
|
19
24
|
offsetTop: number;
|
package/lib/stk-table-vue.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* name: stk-table-vue
|
|
3
|
-
* version: v1.2.
|
|
3
|
+
* version: v1.2.5
|
|
4
4
|
* description: High performance realtime virtual table for vue3 and vue2.7
|
|
5
5
|
* author: japlus
|
|
6
6
|
* homepage: https://ja-plus.github.io/stk-table-vue/
|
|
7
7
|
* license: MIT
|
|
8
8
|
*/
|
|
9
|
-
import { a as insertToOrderedArray, i as binarySearch, n as registerFeature, o as strCompare, r as useAreaSelection, s as tableSort, t as StkTable_default } from "./StkTable-
|
|
9
|
+
import { a as insertToOrderedArray, i as binarySearch, n as registerFeature, o as strCompare, r as useAreaSelection, s as tableSort, t as StkTable_default } from "./StkTable-CzktjLlV.js";
|
|
10
10
|
import { Fragment, computed, createApp, createBlock, createElementBlock, createElementVNode, createTextVNode, defineComponent, getCurrentInstance, h, markRaw, nextTick, normalizeClass, openBlock, ref, renderSlot, resolveDynamicComponent, toDisplayString, watch, withModifiers } from "vue";
|
|
11
11
|
//#region src/StkTable/custom-cells/FilterCell/Dropdown/index.ts
|
|
12
12
|
var DropdownIns = null;
|
|
@@ -15,7 +15,7 @@ async function getDropdownIns() {
|
|
|
15
15
|
const div = document.createElement("div");
|
|
16
16
|
div.classList.add("stk-filter-dropdown-wrapper");
|
|
17
17
|
document.body.appendChild(div);
|
|
18
|
-
DropdownIns = createApp(await import("./Dropdown-
|
|
18
|
+
DropdownIns = createApp(await import("./Dropdown-C4c7Nmgf.js").then((module) => module.default)).mount(div);
|
|
19
19
|
}
|
|
20
20
|
return DropdownIns;
|
|
21
21
|
}
|
package/lib/style.css
CHANGED
package/package.json
CHANGED
|
@@ -302,6 +302,36 @@ export default {
|
|
|
302
302
|
|
|
303
303
|
<script setup lang="ts">
|
|
304
304
|
/**
|
|
305
|
+
* StkTable 主组件(Vue 3 / Vue 2.7)
|
|
306
|
+
*
|
|
307
|
+
* 这是一个超大的核心组件文件,约 1800+ 行。理解它时请按以下「分区地图」定位:
|
|
308
|
+
*
|
|
309
|
+
* 1. 顶部(template 261 行前)
|
|
310
|
+
* 渲染结构:滚动容器 + 原生 <table>。包括 colgroup(固定模式列宽)、thead(多级表头、
|
|
311
|
+
* sticky 固定)、tbody(虚拟滚动 tr / 空 td 定位)、tfoot(汇总行)、自定义滚动条容器。
|
|
312
|
+
* 通过 CSS 类(如 virtual / virtual-x / area-selection / theme 等)联动对应 hook 状态。
|
|
313
|
+
*
|
|
314
|
+
* 2. script setup(270 行起)
|
|
315
|
+
* - props 定义:全部配置项,即公共 API(对应 types/index.ts 与文档 table-props.md)。
|
|
316
|
+
* - 大量 useXxx hooks 的组装:本文件只做「装配」,具体逻辑在对应 hook 中。
|
|
317
|
+
*
|
|
318
|
+
* 3. 核心 hook 与职责(均在 src/StkTable/use*.ts):
|
|
319
|
+
* - useVirtualScroll XY 轴虚拟滚动(可视区裁剪、占位 tr/th 定位、scroll 计算)
|
|
320
|
+
* - useTableColumns 列配置归一化 / 多级表头展开为叶子列
|
|
321
|
+
* - useFixedCol/useFixedStyle/getFixedColPosition 固定列 sticky/relative 定位
|
|
322
|
+
* - useSorter/useTableColumns.sort 排序(本地/远端、多列)
|
|
323
|
+
* - useColResize/useThDrag/useTrDrag 列宽调整 / 表头拖拽 / 行拖拽
|
|
324
|
+
* - useMergeCells/useMaxRowSpan 单元格合并与最大行跨
|
|
325
|
+
* - useRowExpand/useTree 展开行 / 树形
|
|
326
|
+
* - useHighlight 单元格/行高亮(Web Animations API 或 css)
|
|
327
|
+
* - useAreaSelection (features/) 区域选取(Excel 式键盘操作)
|
|
328
|
+
* - useScrollbar/useScrollRowByRow/useWheeling 自定义滚动条 / 按行滚动 / 滚轮
|
|
329
|
+
* - useAutoResize 容器尺寸自动适配
|
|
330
|
+
*
|
|
331
|
+
* 4. expose:对外暴露的实例方法(对应文档 expose.md),供 ref 调用。
|
|
332
|
+
*
|
|
333
|
+
* 注意:此文件与 vue2.7 兼容,props 不可抽离到独立文件(见下方注释),修改时注意不要破坏兼容性。
|
|
334
|
+
*
|
|
305
335
|
* @author japlus
|
|
306
336
|
*/
|
|
307
337
|
import { computed, nextTick, onMounted, provide, ref, shallowRef, toRaw, toRef, watch } from 'vue';
|
|
@@ -400,6 +430,7 @@ const props = withDefaults(
|
|
|
400
430
|
/**
|
|
401
431
|
* 行高
|
|
402
432
|
* - `props.autoRowHeight` 为 `true` 时,将表示为期望行高,用于计算。不再影响实际行高。
|
|
433
|
+
* - 支持动态修改,修改后自动重算可视区行数与滚动高度,并与 `--row-height` 保持同步。
|
|
403
434
|
*/
|
|
404
435
|
rowHeight?: number;
|
|
405
436
|
/**
|
|
@@ -415,9 +446,15 @@ const props = withDefaults(
|
|
|
415
446
|
* @deprecated
|
|
416
447
|
*/
|
|
417
448
|
rowCurrentRevokable?: boolean;
|
|
418
|
-
/**
|
|
449
|
+
/**
|
|
450
|
+
* 表头行高。default = rowHeight
|
|
451
|
+
* - 支持动态修改,表头占用的表体行数(pageSize)随之重算。
|
|
452
|
+
*/
|
|
419
453
|
headerRowHeight?: number | string;
|
|
420
|
-
/**
|
|
454
|
+
/**
|
|
455
|
+
* 表尾行高。default = rowHeight
|
|
456
|
+
* - 支持动态修改。表尾行悬浮于滚动区底部,不计入虚拟滚动的总高度。
|
|
457
|
+
*/
|
|
421
458
|
footerRowHeight?: number | string;
|
|
422
459
|
/** 虚拟滚动 */
|
|
423
460
|
virtual?: boolean;
|
|
@@ -1184,7 +1221,21 @@ watch(
|
|
|
1184
1221
|
},
|
|
1185
1222
|
);
|
|
1186
1223
|
|
|
1187
|
-
|
|
1224
|
+
/**
|
|
1225
|
+
* 行高类配置变化后重算虚拟滚动几何。
|
|
1226
|
+
* 合并为一个 watcher:同一 tick 内多项同时变化只重算一次。
|
|
1227
|
+
* 必须无参调用 initVirtualScrollY(其首参是虚拟滚动容器高度,不能把行高值传入),
|
|
1228
|
+
* 且需 nextTick 等新的 --row-height / 表头行高等样式应用到 DOM 后再测量。
|
|
1229
|
+
*
|
|
1230
|
+
* 监听值拼接为单个原始值(字符串)而非返回数组:getter 返回数组时每次求值都是新数组,
|
|
1231
|
+
* 身份比较必然变化,父组件传入内联对象字面量(如 :expand-config="{ height: 40 }",官方示例即如此写法)
|
|
1232
|
+
* 会让本 watcher 在父组件每次重渲染时误触发;展开行/变高大表下误触发一次会连带行高树 O(n) 重建
|
|
1233
|
+
* (实测 50K 行每次父重渲染多付 ~10ms)。拼接为原始值后仅在值真正变化时触发,且兼容 Vue 2.7。
|
|
1234
|
+
*/
|
|
1235
|
+
watch(
|
|
1236
|
+
() => `${props.rowHeight}|${props.headerRowHeight}|${props.footerRowHeight}|${props.expandConfig?.height}`,
|
|
1237
|
+
() => nextTick(initVirtualScrollY),
|
|
1238
|
+
);
|
|
1188
1239
|
|
|
1189
1240
|
watch(
|
|
1190
1241
|
() => props.virtualX,
|
|
@@ -15,9 +15,19 @@ import { getCalculatedColWidth } from '../utils/constRefUtils';
|
|
|
15
15
|
import { MY_FN_NAME } from './const';
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
18
|
+
* 单元格区域选择功能(Excel 式交互)。
|
|
19
|
+
* 支持鼠标拖拽选择、键盘导航(方向键/Tab/Shift+Tab,Ctrl 多选、Shift 扩选)、复制到剪贴板。
|
|
20
20
|
* en: Cell area selection feature with mouse drag, keyboard navigation, copy-paste, etc.
|
|
21
|
+
*
|
|
22
|
+
* 分区说明:
|
|
23
|
+
* - 选区状态:锚点 begin / 终点 end、选区集合、是否正在拖拽选中(isAreaSelecting)。
|
|
24
|
+
* - 鼠标交互:mousedown 起锚、mousemove 扩展选区、拖拽靠近容器边缘时自动滚动(EDGE_ZONE/SCROLL_SPEED_MAX)。
|
|
25
|
+
* - 键盘交互:方向键/Tab 移动选区(见 useKeyboardArrowScroll 联动)、Ctrl 切换多选、Shift 扩选。
|
|
26
|
+
* - 复制:通过 formatCellForClipboard 回调(若配置了 customCell 应自定义)生成剪贴板文本。
|
|
27
|
+
* - 选区转换:单元格的可见/数据坐标通过 getRowIndex/getColumnIndex、cellKeyGen/colKeyGen 与
|
|
28
|
+
* 虚拟滚动(虚拟窗口裁剪)和列宽缓存(getCalculatedColWidth)相互换算。
|
|
29
|
+
*
|
|
30
|
+
* 对外返回:选区配置/状态、选区范围读写(setAreaSelection/getAreaSelection)、复制处理、选择/取消等。
|
|
21
31
|
*/
|
|
22
32
|
function useAreaSelectionImpl<DT extends Record<string, any>>(
|
|
23
33
|
props: any,
|
|
@@ -1017,6 +1027,7 @@ function useAreaSelectionImpl<DT extends Record<string, any>>(
|
|
|
1017
1027
|
const isScrollRowByRow = props.scrollRowByRow;
|
|
1018
1028
|
|
|
1019
1029
|
// 计算目标行的位置(基于虚拟滚动数据)
|
|
1030
|
+
// vs.rowHeight 由 initVirtualScrollY 随 props.rowHeight 同步,动态改行高后此处即新值
|
|
1020
1031
|
const rowHeight = vs.rowHeight;
|
|
1021
1032
|
const targetRowTop = rowIndex * rowHeight;
|
|
1022
1033
|
const targetRowBottom = targetRowTop + rowHeight;
|
|
@@ -314,7 +314,10 @@ export type SeqConfig = {
|
|
|
314
314
|
|
|
315
315
|
/** Configuration options for the expand column */
|
|
316
316
|
export type ExpandConfig = {
|
|
317
|
-
/**
|
|
317
|
+
/**
|
|
318
|
+
* worked in virtual mode
|
|
319
|
+
* 展开行的行高,支持动态修改(修改后行高累计与虚拟滚动会一同重算)
|
|
320
|
+
*/
|
|
318
321
|
height?: number;
|
|
319
322
|
};
|
|
320
323
|
|
|
@@ -6,6 +6,17 @@ import { howDeepTheHeader } from './utils/index';
|
|
|
6
6
|
/**
|
|
7
7
|
* Table Columns Processing Hook
|
|
8
8
|
* Handles multi-level header processing and column flattening
|
|
9
|
+
*
|
|
10
|
+
* 核心职责:
|
|
11
|
+
* - 将用户传入的 `columns`(可能含 children 多级表头)摊平为「按层级划分」的二维数组 `tableHeaders`,
|
|
12
|
+
* 每层是同一行的 th 集合;同时生成 `tableHeadersForCalc`(复制 rowSpan 位置)用于固定列计算。
|
|
13
|
+
* - 为每个列补充私有元数据(@private 字段):
|
|
14
|
+
* - __P__ 父列引用(双向链表)
|
|
15
|
+
* - __LF_S__ / __LF_E__ 该列在叶子列中的起止索引,用于多级表头横向虚拟滚动
|
|
16
|
+
* - __W__ 计算宽度(子列累加 / 叶子列取配置宽度)
|
|
17
|
+
* - __R_SP__ / __C_SP__ th 的 rowSpan / colSpan
|
|
18
|
+
* - 在 relative 模式(isRelativeMode)下,固定列不再用 sticky,而是重排到左右两侧。
|
|
19
|
+
* - 叶子列宽度是 X 轴虚拟滚动的依据(getColWidth)。
|
|
9
20
|
*/
|
|
10
21
|
export function useTableColumns<DT extends Record<string, any>>(virtualX: boolean, isRelativeMode: Ref<boolean>) {
|
|
11
22
|
/**
|
|
@@ -17,7 +17,12 @@ export type VirtualScrollStore = {
|
|
|
17
17
|
startIndex: number;
|
|
18
18
|
/** 数组结束位置 */
|
|
19
19
|
endIndex: number;
|
|
20
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* 基准行高(px)。
|
|
22
|
+
* 由 initVirtualScrollY 随 props.rowHeight 同步(模板中的 --row-height 亦取此值,二者同源),
|
|
23
|
+
* 因此行高配置动态变化后此处不会是旧快照。
|
|
24
|
+
* 仅记录统一基准行高:变高模式(autoRowHeight)与展开行的行级高度不写入此字段。
|
|
25
|
+
*/
|
|
21
26
|
rowHeight: number;
|
|
22
27
|
/** 表格定位上边距 */
|
|
23
28
|
offsetTop: number;
|
|
@@ -192,8 +197,7 @@ export function useVirtualScroll(
|
|
|
192
197
|
|
|
193
198
|
const virtualX_on = computed(() => {
|
|
194
199
|
return (
|
|
195
|
-
props.virtualX &&
|
|
196
|
-
tableHeaderLast.value.reduce((sum, col) => (sum += getCalculatedColWidth(col)), 0) > virtualScrollX.value.containerWidth + 100
|
|
200
|
+
props.virtualX && tableHeaderLast.value.reduce((sum, col) => (sum += getCalculatedColWidth(col)), 0) > virtualScrollX.value.containerWidth
|
|
197
201
|
);
|
|
198
202
|
});
|
|
199
203
|
|
|
@@ -603,7 +607,9 @@ export function useVirtualScroll(
|
|
|
603
607
|
/** fix: 滚动条不在顶部时,表格数据变少,导致滚动条位置有误 */
|
|
604
608
|
scrollTop = maxScrollTop;
|
|
605
609
|
}
|
|
606
|
-
|
|
610
|
+
// rowHeight 必须随 props.rowHeight 变化同步:模板的 --row-height 与 SRBR/区域选取均读此字段,
|
|
611
|
+
// 若只在 shallowRef 初始化时求值一次,改行高后会出现「计算已用新行高、渲染仍是旧行高」的不一致。
|
|
612
|
+
assignVs(virtualScroll, { rowHeight, containerHeight, pageSize, scrollHeight });
|
|
607
613
|
updateVirtualScrollY(scrollTop);
|
|
608
614
|
}
|
|
609
615
|
|