stk-table-vue 0.0.2 → 0.1.0
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/README.md +118 -5
- package/lib/src/StkTable/StkTable.vue.d.ts +27 -2
- package/lib/src/StkTable/const.d.ts +21 -20
- package/lib/src/StkTable/types/index.d.ts +15 -2
- package/lib/src/StkTable/useKeyboardArrowScroll.d.ts +6 -3
- package/lib/stk-table-vue.js +462 -290
- package/lib/style.css +44 -10
- package/package.json +1 -1
- package/src/StkTable/StkTable.vue +171 -55
- package/src/StkTable/const.ts +1 -0
- package/src/StkTable/style.less +55 -22
- package/src/StkTable/types/index.ts +15 -2
- package/src/StkTable/useKeyboardArrowScroll.ts +24 -10
- package/src/StkTable/useVirtualScroll.ts +1 -1
- package/src/vite-env.d.ts +1 -0
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# StkTable (Sticky Table)
|
|
2
2
|
|
|
3
3
|
Vue3 简易虚拟滚动表格。用于实时数据展示,新数据行高亮渐暗动效。
|
|
4
|
-
js体积(未压缩
|
|
4
|
+
js体积(未压缩44kb)
|
|
5
5
|
|
|
6
6
|
## Feature TODO:
|
|
7
7
|
* [x] 高亮行,单元格。
|
|
@@ -17,9 +17,11 @@ js体积(未压缩41kb)
|
|
|
17
17
|
* [x] 支持table-layout: fixed 配置。
|
|
18
18
|
* 鼠标悬浮在表格上,键盘滚动虚拟表格。
|
|
19
19
|
- [x] 键盘 `ArrowUp`/`ArrowDown`/`ArrowLeft`/`ArrowRight` 按键支持。
|
|
20
|
-
- [] 键盘 `PageUp`/ `PageDown` 按键支持。
|
|
20
|
+
- [x] 键盘 `PageUp`/ `PageDown` 按键支持。
|
|
21
21
|
* [x] 斑马纹。
|
|
22
|
-
* [] 列固定阴影。
|
|
22
|
+
* [x] 列固定阴影。
|
|
23
|
+
- [] 多级表头固定列阴影。
|
|
24
|
+
- [] sticky column 动态计算阴影位置。
|
|
23
25
|
* [] 不传row-key 时,自动按序号生成id。
|
|
24
26
|
* [] 列筛选。
|
|
25
27
|
* [] 非虚拟滚动时,大数据分批加载。
|
|
@@ -42,8 +44,13 @@ stkTable.value.setHighlightDimCell(rowId, colId) // highlight cell
|
|
|
42
44
|
</template>
|
|
43
45
|
|
|
44
46
|
```
|
|
47
|
+
|
|
48
|
+
## Notice
|
|
49
|
+
注意,组件会改动 `props.columns` 中的对象。如果多个组件 `columns` 数组元素存在引用同一个 `StkTableColumn` 对象。则考虑赋值 `columns` 前进行深拷贝。
|
|
50
|
+
|
|
45
51
|
## API
|
|
46
|
-
### StkTable Component
|
|
52
|
+
### StkTable Component
|
|
53
|
+
#### Props
|
|
47
54
|
```ts
|
|
48
55
|
export type StkProps = {
|
|
49
56
|
width?: string;
|
|
@@ -61,6 +68,8 @@ export type StkProps = {
|
|
|
61
68
|
theme?: 'light' | 'dark';
|
|
62
69
|
/** 行高 */
|
|
63
70
|
rowHeight?: number;
|
|
71
|
+
/** 表头行高。default = rowHeight */
|
|
72
|
+
headerRowHeight?: number | null;
|
|
64
73
|
/** 虚拟滚动 */
|
|
65
74
|
virtual?: boolean;
|
|
66
75
|
/** x轴虚拟滚动 */
|
|
@@ -116,10 +125,112 @@ export type StkProps = {
|
|
|
116
125
|
* 传入方法表示resize后的回调
|
|
117
126
|
*/
|
|
118
127
|
autoResize?: boolean | (() => void);
|
|
128
|
+
/** 是否展示固定列阴影。默认不展示。 */
|
|
129
|
+
fixedColShadow?: boolean;
|
|
119
130
|
};
|
|
120
131
|
```
|
|
132
|
+
#### Emits
|
|
133
|
+
```js
|
|
134
|
+
{
|
|
135
|
+
/**
|
|
136
|
+
* 排序变更触发
|
|
137
|
+
* ```(col: StkTableColumn<DT>, order: Order, data: DT[])```
|
|
138
|
+
*/
|
|
139
|
+
(e: 'sort-change', col: StkTableColumn<DT>, order: Order, data: DT[]): void;
|
|
140
|
+
/**
|
|
141
|
+
* 一行点击事件
|
|
142
|
+
* ```(ev: MouseEvent, row: DT)```
|
|
143
|
+
*/
|
|
144
|
+
(e: 'row-click', ev: MouseEvent, row: DT): void;
|
|
145
|
+
/**
|
|
146
|
+
* 选中一行触发。ev返回null表示不是点击事件触发的
|
|
147
|
+
* ```(ev: MouseEvent | null, row: DT)```
|
|
148
|
+
*/
|
|
149
|
+
(e: 'current-change', ev: MouseEvent | null, row: DT): void;
|
|
150
|
+
/**
|
|
151
|
+
* 行双击事件
|
|
152
|
+
* ```(ev: MouseEvent, row: DT)```
|
|
153
|
+
*/
|
|
154
|
+
(e: 'row-dblclick', ev: MouseEvent, row: DT): void;
|
|
155
|
+
/**
|
|
156
|
+
* 表头右键事件
|
|
157
|
+
* ```(ev: MouseEvent)```
|
|
158
|
+
*/
|
|
159
|
+
(e: 'header-row-menu', ev: MouseEvent): void;
|
|
160
|
+
/**
|
|
161
|
+
* 表体行右键点击事件
|
|
162
|
+
* ```(ev: MouseEvent, row: DT)```
|
|
163
|
+
*/
|
|
164
|
+
(e: 'row-menu', ev: MouseEvent, row: DT): void;
|
|
165
|
+
/**
|
|
166
|
+
* 单元格点击事件
|
|
167
|
+
* ```(ev: MouseEvent, row: DT, col: StkTableColumn<DT>)```
|
|
168
|
+
*/
|
|
169
|
+
(e: 'cell-click', ev: MouseEvent, row: DT, col: StkTableColumn<DT>): void;
|
|
170
|
+
/**
|
|
171
|
+
* 表头单元格点击事件
|
|
172
|
+
* ```(ev: MouseEvent, col: StkTableColumn<DT>)```
|
|
173
|
+
*/
|
|
174
|
+
(e: 'header-cell-click', ev: MouseEvent, col: StkTableColumn<DT>): void;
|
|
175
|
+
/**
|
|
176
|
+
* 表格滚动事件
|
|
177
|
+
* ```(ev: Event, data: { startIndex: number; endIndex: number })```
|
|
178
|
+
*/
|
|
179
|
+
(e: 'scroll', ev: Event, data: { startIndex: number; endIndex: number }): void;
|
|
180
|
+
/**
|
|
181
|
+
* 表格横向滚动事件
|
|
182
|
+
* ```(ev: Event)```
|
|
183
|
+
*/
|
|
184
|
+
(e: 'scroll-x', ev: Event): void;
|
|
185
|
+
/**
|
|
186
|
+
* 表头列拖动事件
|
|
187
|
+
* ```(dragStartKey: string, targetColKey: string)```
|
|
188
|
+
*/
|
|
189
|
+
(e: 'col-order-change', dragStartKey: string, targetColKey: string): void;
|
|
190
|
+
/**
|
|
191
|
+
* 表头列拖动开始
|
|
192
|
+
* ```(dragStartKey: string)```
|
|
193
|
+
*/
|
|
194
|
+
(e: 'th-drag-start', dragStartKey: string): void;
|
|
195
|
+
/**
|
|
196
|
+
* 表头列拖动drop
|
|
197
|
+
* ```(targetColKey: string)```
|
|
198
|
+
*/
|
|
199
|
+
(e: 'th-drop', targetColKey: string): void;
|
|
200
|
+
/** v-model:columns col resize 时更新宽度*/
|
|
201
|
+
(e: 'update:columns', cols: StkTableColumn<DT>[]): void;
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
#### Expose
|
|
206
|
+
```js
|
|
207
|
+
defineExpose({
|
|
208
|
+
/** 初始化横向纵向虚拟滚动 */
|
|
209
|
+
initVirtualScroll,
|
|
210
|
+
/** 初始化横向虚拟滚动 */
|
|
211
|
+
initVirtualScrollX,
|
|
212
|
+
/** 初始化纵向虚拟滚动 */
|
|
213
|
+
initVirtualScrollY,
|
|
214
|
+
/** 设置当前选中行 */
|
|
215
|
+
setCurrentRow,
|
|
216
|
+
/** 设置高亮渐暗单元格 */
|
|
217
|
+
setHighlightDimCell,
|
|
218
|
+
/** 设置高亮渐暗行 */
|
|
219
|
+
setHighlightDimRow,
|
|
220
|
+
/** 表格排序列dataIndex */
|
|
221
|
+
sortCol,
|
|
222
|
+
/** 设置排序 */
|
|
223
|
+
setSorter,
|
|
224
|
+
/** 重置排序 */
|
|
225
|
+
resetSorter,
|
|
226
|
+
/** 滚动至 */
|
|
227
|
+
scrollTo,
|
|
228
|
+
/** 获取表格数据 */
|
|
229
|
+
getTableData,
|
|
230
|
+
});
|
|
231
|
+
```
|
|
121
232
|
|
|
122
|
-
### StkTableColumn
|
|
233
|
+
### StkTableColumn 列配置
|
|
123
234
|
``` ts
|
|
124
235
|
type Sorter<T> = boolean | ((data: T[], option: { order: Order; column: any }) => T[]);
|
|
125
236
|
/** 表格列配置 */
|
|
@@ -184,6 +295,7 @@ export type StkTableColumn<T extends Record<string, any>> = {
|
|
|
184
295
|
no-data-full
|
|
185
296
|
col-resizable
|
|
186
297
|
auto-resize
|
|
298
|
+
fixed-col-shadow
|
|
187
299
|
:col-min-width="10"
|
|
188
300
|
:headless="false"
|
|
189
301
|
:data-source="dataSource"
|
|
@@ -196,6 +308,7 @@ export type StkTableColumn<T extends Record<string, any>> = {
|
|
|
196
308
|
@cell-click="onCellClick"
|
|
197
309
|
@header-cell-click="onHeaderCellClick"
|
|
198
310
|
@scroll="onTableScroll"
|
|
311
|
+
@scroll-x="onTableScrollX"
|
|
199
312
|
@col-order-change="onColOrderChange"
|
|
200
313
|
/>
|
|
201
314
|
</template>
|
|
@@ -46,6 +46,8 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__
|
|
|
46
46
|
theme?: "light" | "dark" | undefined;
|
|
47
47
|
/** 行高 */
|
|
48
48
|
rowHeight?: number | undefined;
|
|
49
|
+
/** 表头行高。default = rowHeight */
|
|
50
|
+
headerRowHeight?: number | null | undefined;
|
|
49
51
|
/** 虚拟滚动 */
|
|
50
52
|
virtual?: boolean | undefined;
|
|
51
53
|
/** x轴虚拟滚动 */
|
|
@@ -101,6 +103,8 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__
|
|
|
101
103
|
* 传入方法表示resize后的回调
|
|
102
104
|
*/
|
|
103
105
|
autoResize?: boolean | (() => void) | undefined;
|
|
106
|
+
/** 是否展示固定列阴影。默认不展示。 */
|
|
107
|
+
fixedColShadow?: boolean | undefined;
|
|
104
108
|
}>, {
|
|
105
109
|
width: string;
|
|
106
110
|
fixedMode: boolean;
|
|
@@ -110,6 +114,7 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__
|
|
|
110
114
|
headless: boolean;
|
|
111
115
|
theme: string;
|
|
112
116
|
rowHeight: number;
|
|
117
|
+
headerRowHeight: null;
|
|
113
118
|
virtual: boolean;
|
|
114
119
|
virtualX: boolean;
|
|
115
120
|
columns: () => never[];
|
|
@@ -129,17 +134,29 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__
|
|
|
129
134
|
colMinWidth: number;
|
|
130
135
|
bordered: boolean;
|
|
131
136
|
autoResize: boolean;
|
|
137
|
+
fixedColShadow: boolean;
|
|
132
138
|
}>, {
|
|
139
|
+
/** 初始化横向纵向虚拟滚动 */
|
|
133
140
|
initVirtualScroll: (height?: number | undefined) => void;
|
|
141
|
+
/** 初始化横向虚拟滚动 */
|
|
134
142
|
initVirtualScrollX: () => void;
|
|
143
|
+
/** 初始化纵向虚拟滚动 */
|
|
135
144
|
initVirtualScrollY: (height?: number | undefined) => void;
|
|
145
|
+
/** 设置当前选中行 */
|
|
136
146
|
setCurrentRow: typeof setCurrentRow;
|
|
147
|
+
/** 设置高亮渐暗单元格 */
|
|
137
148
|
setHighlightDimCell: (rowKeyValue: string, dataIndex: string) => void;
|
|
149
|
+
/** 设置高亮渐暗行 */
|
|
138
150
|
setHighlightDimRow: (rowKeyValues: (string | number)[]) => void;
|
|
151
|
+
/** 表格排序列dataIndex */
|
|
139
152
|
sortCol: import("vue").Ref<string | null | undefined>;
|
|
153
|
+
/** 设置排序 */
|
|
140
154
|
setSorter: typeof setSorter;
|
|
155
|
+
/** 重置排序 */
|
|
141
156
|
resetSorter: typeof resetSorter;
|
|
157
|
+
/** 滚动至 */
|
|
142
158
|
scrollTo: typeof scrollTo;
|
|
159
|
+
/** 获取表格数据 */
|
|
143
160
|
getTableData: typeof getTableData;
|
|
144
161
|
}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
145
162
|
"sort-change": (col: StkTableColumn<any>, order: Order, data: any[]) => void;
|
|
@@ -175,6 +192,8 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__
|
|
|
175
192
|
theme?: "light" | "dark" | undefined;
|
|
176
193
|
/** 行高 */
|
|
177
194
|
rowHeight?: number | undefined;
|
|
195
|
+
/** 表头行高。default = rowHeight */
|
|
196
|
+
headerRowHeight?: number | null | undefined;
|
|
178
197
|
/** 虚拟滚动 */
|
|
179
198
|
virtual?: boolean | undefined;
|
|
180
199
|
/** x轴虚拟滚动 */
|
|
@@ -230,6 +249,8 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__
|
|
|
230
249
|
* 传入方法表示resize后的回调
|
|
231
250
|
*/
|
|
232
251
|
autoResize?: boolean | (() => void) | undefined;
|
|
252
|
+
/** 是否展示固定列阴影。默认不展示。 */
|
|
253
|
+
fixedColShadow?: boolean | undefined;
|
|
233
254
|
}>, {
|
|
234
255
|
width: string;
|
|
235
256
|
fixedMode: boolean;
|
|
@@ -239,6 +260,7 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__
|
|
|
239
260
|
headless: boolean;
|
|
240
261
|
theme: string;
|
|
241
262
|
rowHeight: number;
|
|
263
|
+
headerRowHeight: null;
|
|
242
264
|
virtual: boolean;
|
|
243
265
|
virtualX: boolean;
|
|
244
266
|
columns: () => never[];
|
|
@@ -258,6 +280,7 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__
|
|
|
258
280
|
colMinWidth: number;
|
|
259
281
|
bordered: boolean;
|
|
260
282
|
autoResize: boolean;
|
|
283
|
+
fixedColShadow: boolean;
|
|
261
284
|
}>>> & {
|
|
262
285
|
onScroll?: ((ev: Event, data: {
|
|
263
286
|
startIndex: number;
|
|
@@ -281,10 +304,11 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__
|
|
|
281
304
|
minWidth: string;
|
|
282
305
|
maxWidth: string;
|
|
283
306
|
rowHeight: number;
|
|
307
|
+
headless: boolean;
|
|
308
|
+
headerRowHeight: number | null;
|
|
284
309
|
colKey: UniqKey;
|
|
285
310
|
stripe: boolean;
|
|
286
311
|
fixedMode: boolean;
|
|
287
|
-
headless: boolean;
|
|
288
312
|
theme: "light" | "dark";
|
|
289
313
|
virtual: boolean;
|
|
290
314
|
virtualX: boolean;
|
|
@@ -304,9 +328,10 @@ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<__
|
|
|
304
328
|
colMinWidth: number;
|
|
305
329
|
bordered: boolean | "h" | "v" | "body-v";
|
|
306
330
|
autoResize: boolean | (() => void);
|
|
331
|
+
fixedColShadow: boolean;
|
|
307
332
|
}, {}>, {
|
|
308
333
|
tableHeader?(_: {
|
|
309
|
-
|
|
334
|
+
col: StkTableColumn<any>;
|
|
310
335
|
}): any;
|
|
311
336
|
empty?(_: {}): any;
|
|
312
337
|
}>;
|
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
export declare const Default_Col_Width = "100";
|
|
2
|
-
export declare const Default_Table_Height = 100;
|
|
3
|
-
export declare const Default_Table_Width = 200;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
1
|
+
export declare const Default_Col_Width = "100";
|
|
2
|
+
export declare const Default_Table_Height = 100;
|
|
3
|
+
export declare const Default_Table_Width = 200;
|
|
4
|
+
export declare const Default_Row_Height = 28;
|
|
5
|
+
/** 高亮背景色 */
|
|
6
|
+
export declare const Highlight_Color: {
|
|
7
|
+
light: {
|
|
8
|
+
from: string;
|
|
9
|
+
to: string;
|
|
10
|
+
};
|
|
11
|
+
dark: {
|
|
12
|
+
from: string;
|
|
13
|
+
to: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
/** 高亮持续时间 */
|
|
17
|
+
export declare const Highlight_Duration = 2000;
|
|
18
|
+
/** 高亮变更频率 */
|
|
19
|
+
export declare const Highlight_Color_Change_Freq = 100;
|
|
20
|
+
/** 是否兼容低版本模式 */
|
|
21
|
+
export declare const Is_Legacy_Mode: boolean;
|
|
@@ -43,12 +43,25 @@ export type StkTableColumn<T extends Record<string, any>> = {
|
|
|
43
43
|
fixed?: 'left' | 'right' | null;
|
|
44
44
|
/** private */ rowSpan?: number;
|
|
45
45
|
/** private */ colSpan?: number;
|
|
46
|
-
|
|
46
|
+
/**
|
|
47
|
+
* 自定义 td 渲染内容。
|
|
48
|
+
*
|
|
49
|
+
* 组件prop入参:
|
|
50
|
+
* - props.row 一行的记录。
|
|
51
|
+
* - props.col 列配置
|
|
52
|
+
*/
|
|
47
53
|
customCell?: Component | VNode | CustomCellFunc<T>;
|
|
48
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* 自定义 th 渲染内容
|
|
56
|
+
*
|
|
57
|
+
* 组件prop入参:
|
|
58
|
+
* - props.col 列配置
|
|
59
|
+
*/
|
|
49
60
|
customHeaderCell?: Component | VNode | CustomHeaderCellFunc<T>;
|
|
50
61
|
/** 二级表头 */
|
|
51
62
|
children?: StkTableColumn<T>[];
|
|
63
|
+
/** 父节点引用 */
|
|
64
|
+
__PARENT__?: StkTableColumn<T> | null;
|
|
52
65
|
};
|
|
53
66
|
export type SortOption = Pick<StkTableColumn<any>, 'sorter' | 'dataIndex' | 'sortField' | 'sortType'>;
|
|
54
67
|
export type SortState<T> = {
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { Ref } from 'vue';
|
|
2
|
+
import { StkTableColumn } from './types';
|
|
2
3
|
import { VirtualScrollStore, VirtualScrollXStore } from './useVirtualScroll';
|
|
3
|
-
type Options = {
|
|
4
|
-
|
|
4
|
+
type Options<DT extends Record<string, any>> = {
|
|
5
|
+
props: any;
|
|
6
|
+
scrollTo: (y: number | null, x: number | null) => void;
|
|
5
7
|
virtualScroll: Ref<VirtualScrollStore>;
|
|
6
8
|
virtualScrollX: Ref<VirtualScrollXStore>;
|
|
9
|
+
tableHeaders: Ref<StkTableColumn<DT>[][]>;
|
|
7
10
|
};
|
|
8
11
|
/**
|
|
9
12
|
* 按下键盘箭头滚动。只有悬浮在表体上才能生效键盘。
|
|
10
13
|
*
|
|
11
14
|
* 在低版本浏览器中,虚拟滚动时,使用键盘滚动,等选中的行消失在视口外时,滚动会失效。
|
|
12
15
|
*/
|
|
13
|
-
export declare function useKeyboardArrowScroll(targetElement: Ref<HTMLElement | undefined>, { scrollTo, virtualScroll, virtualScrollX }: Options): void;
|
|
16
|
+
export declare function useKeyboardArrowScroll<DT extends Record<string, any>>(targetElement: Ref<HTMLElement | undefined>, { props, scrollTo, virtualScroll, virtualScrollX, tableHeaders }: Options<DT>): void;
|
|
14
17
|
export {};
|