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 CHANGED
@@ -1,7 +1,7 @@
1
1
  # StkTable (Sticky Table)
2
2
 
3
3
  Vue3 简易虚拟滚动表格。用于实时数据展示,新数据行高亮渐暗动效。
4
- js体积(未压缩41kb)
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 Props
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
- column: StkTableColumn<any>;
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
- export declare const Highlight_Color: {
6
- light: {
7
- from: string;
8
- to: string;
9
- };
10
- dark: {
11
- from: string;
12
- to: string;
13
- };
14
- };
15
- /** 高亮持续时间 */
16
- export declare const Highlight_Duration = 2000;
17
- /** 高亮变更频率 */
18
- export declare const Highlight_Color_Change_Freq = 100;
19
- /** 是否兼容低版本模式 */
20
- export declare const Is_Legacy_Mode: boolean;
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
- /**自定义 td 渲染内容 */
46
+ /**
47
+ * 自定义 td 渲染内容。
48
+ *
49
+ * 组件prop入参:
50
+ * - props.row 一行的记录。
51
+ * - props.col 列配置
52
+ */
47
53
  customCell?: Component | VNode | CustomCellFunc<T>;
48
- /** 自定义 th 渲染内容 */
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
- scrollTo: (x: number | null, y: number | null) => void;
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 {};