stk-table-vue 1.2.0 → 1.2.2
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-Bq4DxXYJ.js → Dropdown-D40QlY91.js} +2 -2
- package/lib/{StkTable-yOz9wkCz.js → StkTable-g_qwf6BE.js} +180 -124
- package/lib/src/StkTable/useSorter.d.ts +2 -1
- package/lib/src/StkTable/useVirtualScroll.d.ts +11 -2
- package/lib/stk-table-vue.js +3 -3
- package/lib/style.css +160 -1
- package/package.json +2 -2
- package/src/StkTable/StkTable.vue +19 -7
- package/src/StkTable/useFixedStyle.ts +2 -2
- package/src/StkTable/useMergeCells.ts +149 -111
- package/src/StkTable/useSorter.ts +9 -1
- package/src/StkTable/useVirtualScroll.ts +38 -11
- package/lib/src/StkTable/features/useAreaSelection.bak.d.ts +0 -25
- package/lib/test/StkTable.browser.test.d.ts +0 -1
- package/lib/test/autoHeightStripe.repro.test.d.ts +0 -1
- package/lib/test/autoRowHeightVirtualScroll.test.d.ts +0 -1
- package/lib/test/defaultSort.test.d.ts +0 -1
- package/lib/test/insertToOrderedArray.test.d.ts +0 -1
- package/lib/test/perf/scrollPerf.test.d.ts +0 -1
- package/lib/test/rowMergeVirtualScroll.repro.test.d.ts +0 -1
- package/lib/test/scrollTo.test.d.ts +0 -1
- package/lib/test/setSorter.test.d.ts +0 -1
- package/lib/test/setTreeExpandParents.test.d.ts +0 -1
- package/lib/test/trReuse.repro.test.d.ts +0 -1
- package/lib/test/utils/DragResize.d.ts +0 -28
- package/lib/test/utils/h.d.ts +0 -10
- package/lib/test/virtualXMerge.test.d.ts +0 -1
- package/src/StkTable/features/useAreaSelection.bak.ts +0 -951
|
@@ -21,7 +21,11 @@ export type VirtualScrollStore = {
|
|
|
21
21
|
rowHeight: number;
|
|
22
22
|
/** 表格定位上边距 */
|
|
23
23
|
offsetTop: number;
|
|
24
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* 纵向滚动条位置,用于判断是横向滚动还是纵向。
|
|
26
|
+
* 静默字段:非 relative 模式下写入不触发 triggerRef(滚动窗口未变的帧零重渲染),
|
|
27
|
+
* 不得在响应式上下文(computed/模板/watch)中依赖此字段。
|
|
28
|
+
*/
|
|
25
29
|
scrollTop: number;
|
|
26
30
|
/** 总滚动高度 */
|
|
27
31
|
scrollHeight: number;
|
|
@@ -43,7 +47,10 @@ export type VirtualScrollXStore = {
|
|
|
43
47
|
endIndex: number;
|
|
44
48
|
/** 表格定位左边距 */
|
|
45
49
|
offsetLeft: number;
|
|
46
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* 横向滚动位置,用于判断是横向滚动还是纵向。
|
|
52
|
+
* 静默字段:非 relative 模式下写入不触发 triggerRef,不得在响应式上下文中依赖此字段。
|
|
53
|
+
*/
|
|
47
54
|
scrollLeft: number;
|
|
48
55
|
};
|
|
49
56
|
|
|
@@ -91,6 +98,10 @@ function useColWidthCache<T extends { fixed?: StkTableColumn<PrivateRowDT>['fixe
|
|
|
91
98
|
/** vue2 优化滚动回收延时 */
|
|
92
99
|
const VUE2_SCROLL_TIMEOUT_MS = 200;
|
|
93
100
|
|
|
101
|
+
/** 静默字段常量(模块级复用,避免每次滚动帧分配数组);relative 模式不静默(见 assignVs 注释) */
|
|
102
|
+
const SILENT_Y_KEYS: ['scrollTop'] = ['scrollTop'];
|
|
103
|
+
const SILENT_X_KEYS: ['scrollLeft'] = ['scrollLeft'];
|
|
104
|
+
|
|
94
105
|
/**
|
|
95
106
|
* 合并单元格可视范围修正的最大迭代次数。
|
|
96
107
|
* 合法(不重叠)的合并配置最多 2 轮即收敛(1 轮扩展 + 1 轮验证);
|
|
@@ -115,6 +126,8 @@ export function useVirtualScroll(
|
|
|
115
126
|
getMaxRowSpanValue: () => number,
|
|
116
127
|
scrollbarOptions: Ref<Required<ScrollbarOptions>>,
|
|
117
128
|
isExperimentalScrollY: Ref<boolean | undefined>,
|
|
129
|
+
/** relative 固定模式的样式(useFixedStyle)以响应式方式依赖 scrollTop/scrollLeft,该模式下保留滚动位置的响应式触发 */
|
|
130
|
+
isRelativeMode: Ref<boolean>,
|
|
118
131
|
/** mergeCells 结果共享缓存(与 useMergeCells 共用,避免重复调用用户回调) */
|
|
119
132
|
mergeCellsCache: MergeCellsCache,
|
|
120
133
|
) {
|
|
@@ -538,15 +551,20 @@ export function useVirtualScroll(
|
|
|
538
551
|
* shallowRef 内部属性变更不会触发响应式,必须手动 triggerRef;但无条件触发会让
|
|
539
552
|
* 「值未变」的调用也强制整表重渲染(每帧滚动多付 1~5ms 渲染成本)。
|
|
540
553
|
* 本函数恢复 Vue 深响应式 ref 的 hasChanged 语义,滚动重算回到 0.02ms 级。
|
|
554
|
+
*
|
|
555
|
+
* silentKeys:写入 store 但不参与 triggerRef 判定的字段。滚动位置(scrollTop/scrollLeft)
|
|
556
|
+
* 每帧必变且模板不直接消费,静默写入使「滚动窗口(startIndex/endIndex)未变」的帧
|
|
557
|
+
* 完全跳过组件重渲染(消费方均在滚动处理函数中即时读取 .value)。
|
|
558
|
+
* relative 固定模式例外:useFixedStyle 的样式计算响应式依赖滚动位置,该模式下不静默。
|
|
541
559
|
*/
|
|
542
|
-
function assignVs<T extends object>(ref: ShallowRef<T>, patch: Partial<T
|
|
560
|
+
function assignVs<T extends object>(ref: ShallowRef<T>, patch: Partial<T>, silentKeys?: (keyof T)[]) {
|
|
543
561
|
const store = ref.value;
|
|
544
562
|
let changed = false;
|
|
545
563
|
for (const key in patch) {
|
|
546
564
|
const k = key as keyof T;
|
|
547
565
|
if (store[k] !== patch[k]) {
|
|
548
566
|
store[k] = patch[k] as T[keyof T];
|
|
549
|
-
changed = true;
|
|
567
|
+
if (!silentKeys?.includes(k)) changed = true;
|
|
550
568
|
}
|
|
551
569
|
}
|
|
552
570
|
if (changed) triggerRef(ref);
|
|
@@ -736,16 +754,21 @@ export function useVirtualScroll(
|
|
|
736
754
|
}
|
|
737
755
|
vsValue.scrollTop = sTop;
|
|
738
756
|
|
|
739
|
-
|
|
757
|
+
// relative 模式固定表头样式响应式依赖 scrollTop,保留触发;其余模式静默写入
|
|
758
|
+
assignVs(virtualScroll, vsValue, isRelativeMode.value ? undefined : SILENT_Y_KEYS);
|
|
740
759
|
|
|
741
760
|
if (!virtual_on.value) {
|
|
742
761
|
// github #34 init
|
|
762
|
+
// endIndex 重置为最后一行而非 0:virtual_on=false 时虽不参与切片(全量渲染),
|
|
763
|
+
// 但若后续数据变多而未被重算(如旧版筛选/排序路径,见 #80),残留 endIndex=0
|
|
764
|
+
// 会使 slice(startIndex, 0+1) 只渲染 1 行;指向末行可让残留窗口覆盖全量数据。
|
|
765
|
+
const lastIdx = Math.max(0, dataLength - 1);
|
|
743
766
|
assignVs(virtualScroll, {
|
|
744
767
|
startIndex: 0,
|
|
745
|
-
endIndex:
|
|
768
|
+
endIndex: lastIdx,
|
|
746
769
|
offsetTop: 0,
|
|
747
770
|
viewportStartIndex: 0,
|
|
748
|
-
viewportEndIndex:
|
|
771
|
+
viewportEndIndex: lastIdx,
|
|
749
772
|
});
|
|
750
773
|
return;
|
|
751
774
|
}
|
|
@@ -864,8 +887,9 @@ export function useVirtualScroll(
|
|
|
864
887
|
endIndex = Math.min(endIndex, dataLength);
|
|
865
888
|
|
|
866
889
|
if (startIndex >= endIndex) {
|
|
867
|
-
// fallback
|
|
868
|
-
startIndex
|
|
890
|
+
// fallback(#80:scrollTop 残留超出新数据长度时 endIndex 被钳到 dataLength,
|
|
891
|
+
// 需回退到末页窗口;钳非负防 pageSize 并常时产生负 startIndex → 负 offsetTop)
|
|
892
|
+
startIndex = Math.max(0, endIndex - pageSize);
|
|
869
893
|
}
|
|
870
894
|
|
|
871
895
|
if (vue2ScrollYTimeout) {
|
|
@@ -958,13 +982,16 @@ export function useVirtualScroll(
|
|
|
958
982
|
window.clearTimeout(vue2ScrollXTimeout);
|
|
959
983
|
}
|
|
960
984
|
|
|
985
|
+
// relative 模式固定列样式响应式依赖 scrollLeft,保留触发;其余模式静默写入
|
|
986
|
+
const silentXKeys = isRelativeMode.value ? undefined : SILENT_X_KEYS;
|
|
987
|
+
|
|
961
988
|
// <= 等于是因为初始化时要赋值
|
|
962
989
|
if (!props.optimizeVue2Scroll || sLeft <= scrollLeft) {
|
|
963
990
|
// 向左滚动
|
|
964
|
-
assignVs(virtualScrollX, { startIndex, endIndex, offsetLeft, scrollLeft: sLeft });
|
|
991
|
+
assignVs(virtualScrollX, { startIndex, endIndex, offsetLeft, scrollLeft: sLeft }, silentXKeys);
|
|
965
992
|
} else {
|
|
966
993
|
// vue2 向右滚动优化
|
|
967
|
-
assignVs(virtualScrollX, { endIndex, scrollLeft: sLeft });
|
|
994
|
+
assignVs(virtualScrollX, { endIndex, scrollLeft: sLeft }, silentXKeys);
|
|
968
995
|
vue2ScrollXTimeout = window.setTimeout(() => {
|
|
969
996
|
assignVs(virtualScrollX, { startIndex, offsetLeft });
|
|
970
997
|
}, VUE2_SCROLL_TIMEOUT_MS);
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Ref, ShallowRef } from 'vue';
|
|
2
|
-
import { AreaSelectionConfig, AreaSelectionRange, CellKeyGen, ColKeyGen, StkTableColumn, UniqKey, AreaSelectionSetterRange, AreaSelectionSetterOption } from '../types';
|
|
3
|
-
import { VirtualScrollStore, VirtualScrollXStore } from '../useVirtualScroll';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* 单元格区域选择功能
|
|
7
|
-
* 支持鼠标拖拽选择、键盘导航、复制粘贴等功能
|
|
8
|
-
* en: Cell area selection feature with mouse drag, keyboard navigation, copy-paste, etc.
|
|
9
|
-
*/
|
|
10
|
-
export declare function useAreaSelection<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
|
-
config: import('vue').ComputedRef<AreaSelectionConfig>;
|
|
12
|
-
isSelecting: Ref<boolean, boolean>;
|
|
13
|
-
getClass: (cellKey: string, absoluteRowIndex: number, colKey: UniqKey) => string[];
|
|
14
|
-
getRowClass: (absoluteRowIndex: number) => string[];
|
|
15
|
-
get: () => {
|
|
16
|
-
rows: DT[];
|
|
17
|
-
cols: StkTableColumn<DT>[];
|
|
18
|
-
ranges: AreaSelectionRange[];
|
|
19
|
-
};
|
|
20
|
-
set: (ranges?: AreaSelectionSetterRange<DT>, option?: AreaSelectionSetterOption) => AreaSelectionRange[];
|
|
21
|
-
clear: () => void;
|
|
22
|
-
copy: () => string;
|
|
23
|
-
onMD: (e: MouseEvent) => void;
|
|
24
|
-
};
|
|
25
|
-
export declare const useAreaSelectionName = "useAreaSelection";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export default class DragResize {
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
* @param {HTMLElement} el
|
|
5
|
-
*/
|
|
6
|
-
constructor(el: HTMLElement);
|
|
7
|
-
buttonSize: {
|
|
8
|
-
width: number;
|
|
9
|
-
height: number;
|
|
10
|
-
};
|
|
11
|
-
/** @type {ResizeObserver} */
|
|
12
|
-
resizeObserver: ResizeObserver;
|
|
13
|
-
/** @type {DOMRect} */
|
|
14
|
-
targetDOMRect: DOMRect;
|
|
15
|
-
/** @type {{left:number,top:number}} */
|
|
16
|
-
resizeButtonStyle: {
|
|
17
|
-
left: number;
|
|
18
|
-
top: number;
|
|
19
|
-
};
|
|
20
|
-
el: HTMLElement;
|
|
21
|
-
initData(): void;
|
|
22
|
-
createResizeButton(): void;
|
|
23
|
-
resizeButton: HTMLElement | undefined;
|
|
24
|
-
/** 监听元素大小改变 */
|
|
25
|
-
onResize(): void;
|
|
26
|
-
addButtonHoverStyle(): void;
|
|
27
|
-
addEvent(): void;
|
|
28
|
-
}
|
package/lib/test/utils/h.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* createElement function
|
|
3
|
-
* h(tag[, text[,children]])
|
|
4
|
-
* h(tag[, attrs[,children]])
|
|
5
|
-
* h(tag[, children])
|
|
6
|
-
* @param {String} tag 标签名称,支持tag#id.class emmet写法,暂支持id ,class
|
|
7
|
-
* @param {Object | String | Number | Array<HTMLElement>} attrs 传Object为属性,传String为textContent,传数组为children
|
|
8
|
-
* @param {Array<HTMLElement>} children
|
|
9
|
-
*/
|
|
10
|
-
export default function h(tag: string, attrs: Object | string | number | Array<HTMLElement>, children: Array<HTMLElement>): HTMLElement;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|