xt-element-ui 2.0.0 → 2.0.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.
@@ -1,344 +1,344 @@
1
- ## XtTable 扩展表格组件
2
-
3
- 基于 ElementUI Table 封装的扩展表格组件,支持虚拟滚动、小计/总计、合并单元格等高级功能。
4
-
5
- ## 基本用法
6
-
7
- ::: demo 基本用法
8
- ```vue
9
- <template>
10
- <XtTable
11
- :table-data="tableData"
12
- :columns="columns"
13
- title="用户列表"
14
- />
15
- </template>
16
-
17
- <script>
18
- export default {
19
- data() {
20
- return {
21
- tableData: [
22
- { name: '张三', age: 25, city: '北京' },
23
- { name: '李四', age: 30, city: '上海' },
24
- { name: '王五', age: 28, city: '广州' }
25
- ],
26
- columns: [
27
- { prop: 'name', label: '姓名' },
28
- { prop: 'age', label: '年龄' },
29
- { prop: 'city', label: '城市' }
30
- ]
31
- }
32
- }
33
- }
34
- </script>
35
- ```
36
- :::
37
-
38
- ## 属性说明
39
-
40
- ### 基础属性
41
-
42
- | 属性 | 类型 | 默认值 | 说明 |
43
- |------|------|--------|------|
44
- | `tableData` | Array | `[]` | 表格数据 |
45
- | `columns` | Array | `[]` | 列配置 |
46
- | `title` | String | `''` | 表格标题 |
47
- | `height` | Number / String | - | 表格高度 |
48
- | `maxHeight` | Number / String | - | 最大高度 |
49
- | `showIndex` | Boolean | `false` | 是否显示序号列 |
50
- | `selection` | Boolean | `false` | 是否显示选择列 |
51
- | `selectionFixed` | Boolean / String | `false` | 选择列是否固定 |
52
- | `indexFixed` | Boolean / String | `false` | 序号列是否固定 |
53
- | `loading` | Boolean | `false` | 是否加载中 |
54
- | `emptyText` | String | `暂无数据` | 空数据提示 |
55
-
56
- ### 虚拟滚动
57
-
58
- | 属性 | 类型 | 默认值 | 说明 |
59
- |------|------|--------|------|
60
- | `virtualScroll` | Boolean | `false` | 是否启用虚拟滚动 |
61
- | `rowInitHeight` | Number | `48` | 行初始高度 |
62
- | `bufferSize` | Number | `5` | 缓冲区行数 |
63
-
64
- ### 小计/总计
65
-
66
- | 属性 | 类型 | 默认值 | 说明 |
67
- |------|------|--------|------|
68
- | `groupColumns` | Array | `[]` | 合并单元格的列字段 |
69
- | `subtotalConfig` | Object | `{ enabled: false }` | 小计配置 |
70
- | `totalConfig` | Object | `{ enabled: false }` | 总计配置 |
71
-
72
- ### 分页
73
-
74
- | 属性 | 类型 | 默认值 | 说明 |
75
- |------|------|--------|------|
76
- | `pagination` | Object | `null` | 分页配置 |
77
- | `total` | Number | `0` | 数据总数 |
78
-
79
- ## 列配置说明
80
-
81
- ```javascript
82
- {
83
- prop: 'name', // 字段名
84
- label: '姓名', // 列标题
85
- width: 100, // 宽度
86
- fixed: true, // 是否固定
87
- align: 'center', // 对齐方式
88
- sortable: true, // 是否可排序
89
- render: (scope) => {}, // 自定义渲染函数
90
- formatter: (row, col) => {}, // 格式化函数
91
- slot: 'custom-slot', // 自定义插槽名
92
- children: [] // 多级表头
93
- }
94
- ```
95
-
96
- ## 示例
97
-
98
- ### 虚拟滚动
99
-
100
- ::: demo 虚拟滚动
101
- ```vue
102
- <template>
103
- <XtTable
104
- :table-data="largeData"
105
- :columns="columns"
106
- :height="400"
107
- virtual-scroll
108
- title="大数据量表格"
109
- />
110
- </template>
111
-
112
- <script>
113
- export default {
114
- data() {
115
- return {
116
- largeData: Array.from({ length: 10000 }, (_, i) => ({
117
- id: i + 1,
118
- name: `用户${i + 1}`,
119
- age: Math.floor(Math.random() * 50) + 20,
120
- city: ['北京', '上海', '广州', '深圳'][Math.floor(Math.random() * 4)]
121
- })),
122
- columns: [
123
- { prop: 'id', label: 'ID', width: 80 },
124
- { prop: 'name', label: '姓名', width: 120 },
125
- { prop: 'age', label: '年龄', width: 80 },
126
- { prop: 'city', label: '城市', width: 100 }
127
- ]
128
- }
129
- }
130
- }
131
- </script>
132
- ```
133
- :::
134
-
135
- ### 合并单元格
136
-
137
- ::: demo 合并单元格
138
- ```vue
139
- <template>
140
- <XtTable
141
- :table-data="tableData"
142
- :columns="columns"
143
- :group-columns="['city']"
144
- title="按城市分组"
145
- />
146
- </template>
147
-
148
- <script>
149
- export default {
150
- data() {
151
- return {
152
- tableData: [
153
- { city: '北京', name: '张三', age: 25 },
154
- { city: '北京', name: '李四', age: 30 },
155
- { city: '上海', name: '王五', age: 28 },
156
- { city: '上海', name: '赵六', age: 32 }
157
- ],
158
- columns: [
159
- { prop: 'city', label: '城市' },
160
- { prop: 'name', label: '姓名' },
161
- { prop: 'age', label: '年龄' }
162
- ]
163
- }
164
- }
165
- }
166
- </script>
167
- ```
168
- :::
169
-
170
- ### 小计和总计
171
-
172
- ::: demo 小计和总计
173
- ```vue
174
- <template>
175
- <XtTable
176
- :table-data="tableData"
177
- :columns="columns"
178
- :group-columns="['category']"
179
- :subtotal-config="subtotalConfig"
180
- :total-config="totalConfig"
181
- title="销售统计"
182
- />
183
- </template>
184
-
185
- <script>
186
- export default {
187
- data() {
188
- return {
189
- tableData: [
190
- { category: '电子产品', name: '手机', price: 5999, count: 10 },
191
- { category: '电子产品', name: '电脑', price: 8999, count: 5 },
192
- { category: '日用品', name: '牙刷', price: 20, count: 100 },
193
- { category: '日用品', name: '毛巾', price: 30, count: 50 }
194
- ],
195
- columns: [
196
- { prop: 'category', label: '分类' },
197
- { prop: 'name', label: '名称' },
198
- { prop: 'price', label: '单价' },
199
- { prop: 'count', label: '数量' }
200
- ],
201
- subtotalConfig: {
202
- enabled: true,
203
- groupBy: ['category'],
204
- labelText: '小计',
205
- columns: {
206
- price: 'sum',
207
- count: 'sum'
208
- }
209
- },
210
- totalConfig: {
211
- enabled: true,
212
- labelText: '总计',
213
- columns: {
214
- price: 'sum',
215
- count: 'sum'
216
- }
217
- }
218
- }
219
- }
220
- }
221
- </script>
222
- ```
223
- :::
224
-
225
- ### 分页
226
-
227
- ::: demo 分页
228
- ```vue
229
- <template>
230
- <XtTable
231
- :table-data="tableData"
232
- :columns="columns"
233
- :pagination="pagination"
234
- :total="100"
235
- title="带分页表格"
236
- @size-change="handleSizeChange"
237
- @page-change="handlePageChange"
238
- />
239
- </template>
240
-
241
- <script>
242
- export default {
243
- data() {
244
- return {
245
- tableData: [
246
- { name: '张三', age: 25, city: '北京' },
247
- { name: '李四', age: 30, city: '上海' }
248
- ],
249
- columns: [
250
- { prop: 'name', label: '姓名' },
251
- { prop: 'age', label: '年龄' },
252
- { prop: 'city', label: '城市' }
253
- ],
254
- pagination: {
255
- pageNum: 1,
256
- pageSize: 20,
257
- pageSizes: [10, 20, 50, 100]
258
- }
259
- }
260
- },
261
- methods: {
262
- handleSizeChange(size) {
263
- this.pagination.pageSize = size
264
- },
265
- handlePageChange(page) {
266
- this.pagination.pageNum = page
267
- }
268
- }
269
- }
270
- </script>
271
- ```
272
- :::
273
-
274
- ### 自定义渲染
275
-
276
- ::: demo 自定义渲染
277
- ```vue
278
- <template>
279
- <XtTable :table-data="tableData" :columns="columns">
280
- <template #action="{ row }">
281
- <XtButton size="small" @click="edit(row)">编辑</XtButton>
282
- <XtButton size="small" type="danger" @click="del(row)">删除</XtButton>
283
- </template>
284
- </XtTable>
285
- </template>
286
-
287
- <script>
288
- export default {
289
- data() {
290
- return {
291
- tableData: [
292
- { id: 1, name: '张三', status: 1 },
293
- { id: 2, name: '李四', status: 0 }
294
- ],
295
- columns: [
296
- { prop: 'id', label: 'ID' },
297
- { prop: 'name', label: '姓名' },
298
- {
299
- prop: 'status',
300
- label: '状态',
301
- formatter: (row) => row.status === 1 ? '正常' : '禁用'
302
- },
303
- { label: '操作', slot: 'action' }
304
- ]
305
- }
306
- },
307
- methods: {
308
- edit(row) {
309
- console.log('编辑', row)
310
- },
311
- del(row) {
312
- console.log('删除', row)
313
- }
314
- }
315
- }
316
- </script>
317
- ```
318
- :::
319
-
320
- ## 事件
321
-
322
- | 事件名 | 说明 | 参数 |
323
- |--------|------|------|
324
- | `selection-change` | 选择项变化 | `selectedRows` |
325
- | `sort-change` | 排序变化 | `sortInfo` |
326
- | `size-change` | 每页条数变化 | `size` |
327
- | `page-change` | 当前页变化 | `page` |
328
-
329
- ## 方法
330
-
331
- | 方法名 | 说明 | 参数 |
332
- |--------|------|------|
333
- | `getSelection` | 获取选中行 | - |
334
- | `clearSelection` | 清除选中 | - |
335
- | `toggleRowSelection` | 切换行选中状态 | `row`, `selected` |
336
- | `toggleRowsSelection` | 批量切换行选中状态 | `rows`, `selected` |
337
- | `doLayout` | 重新计算布局 | - |
338
-
339
- ## 插槽
340
-
341
- | 插槽名 | 说明 |
342
- |--------|------|
343
- | `toolbar` | 工具栏区域(标题右侧) |
1
+ ## XtTable 扩展表格组件
2
+
3
+ 基于 ElementUI Table 封装的扩展表格组件,支持虚拟滚动、小计/总计、合并单元格等高级功能。
4
+
5
+ ## 基本用法
6
+
7
+ ::: demo 基本用法
8
+ ```vue
9
+ <template>
10
+ <XtTable
11
+ :table-data="tableData"
12
+ :columns="columns"
13
+ title="用户列表"
14
+ />
15
+ </template>
16
+
17
+ <script>
18
+ export default {
19
+ data() {
20
+ return {
21
+ tableData: [
22
+ { name: '张三', age: 25, city: '北京' },
23
+ { name: '李四', age: 30, city: '上海' },
24
+ { name: '王五', age: 28, city: '广州' }
25
+ ],
26
+ columns: [
27
+ { prop: 'name', label: '姓名' },
28
+ { prop: 'age', label: '年龄' },
29
+ { prop: 'city', label: '城市' }
30
+ ]
31
+ }
32
+ }
33
+ }
34
+ </script>
35
+ ```
36
+ :::
37
+
38
+ ## 属性说明
39
+
40
+ ### 基础属性
41
+
42
+ | 属性 | 类型 | 默认值 | 说明 |
43
+ |------|------|--------|------|
44
+ | `tableData` | Array | `[]` | 表格数据 |
45
+ | `columns` | Array | `[]` | 列配置 |
46
+ | `title` | String | `''` | 表格标题 |
47
+ | `height` | Number / String | - | 表格高度 |
48
+ | `maxHeight` | Number / String | - | 最大高度 |
49
+ | `showIndex` | Boolean | `false` | 是否显示序号列 |
50
+ | `selection` | Boolean | `false` | 是否显示选择列 |
51
+ | `selectionFixed` | Boolean / String | `false` | 选择列是否固定 |
52
+ | `indexFixed` | Boolean / String | `false` | 序号列是否固定 |
53
+ | `loading` | Boolean | `false` | 是否加载中 |
54
+ | `emptyText` | String | `暂无数据` | 空数据提示 |
55
+
56
+ ### 虚拟滚动
57
+
58
+ | 属性 | 类型 | 默认值 | 说明 |
59
+ |------|------|--------|------|
60
+ | `virtualScroll` | Boolean | `false` | 是否启用虚拟滚动 |
61
+ | `rowInitHeight` | Number | `48` | 行初始高度 |
62
+ | `bufferSize` | Number | `5` | 缓冲区行数 |
63
+
64
+ ### 小计/总计
65
+
66
+ | 属性 | 类型 | 默认值 | 说明 |
67
+ |------|------|--------|------|
68
+ | `groupColumns` | Array | `[]` | 合并单元格的列字段 |
69
+ | `subtotalConfig` | Object | `{ enabled: false }` | 小计配置 |
70
+ | `totalConfig` | Object | `{ enabled: false }` | 总计配置 |
71
+
72
+ ### 分页
73
+
74
+ | 属性 | 类型 | 默认值 | 说明 |
75
+ |------|------|--------|------|
76
+ | `pagination` | Object | `null` | 分页配置 |
77
+ | `total` | Number | `0` | 数据总数 |
78
+
79
+ ## 列配置说明
80
+
81
+ ```javascript
82
+ {
83
+ prop: 'name', // 字段名
84
+ label: '姓名', // 列标题
85
+ width: 100, // 宽度
86
+ fixed: true, // 是否固定
87
+ align: 'center', // 对齐方式
88
+ sortable: true, // 是否可排序
89
+ render: (scope) => {}, // 自定义渲染函数
90
+ formatter: (row, col) => {}, // 格式化函数
91
+ slot: 'custom-slot', // 自定义插槽名
92
+ children: [] // 多级表头
93
+ }
94
+ ```
95
+
96
+ ## 示例
97
+
98
+ ### 虚拟滚动
99
+
100
+ ::: demo 虚拟滚动
101
+ ```vue
102
+ <template>
103
+ <XtTable
104
+ :table-data="largeData"
105
+ :columns="columns"
106
+ :height="400"
107
+ virtual-scroll
108
+ title="大数据量表格"
109
+ />
110
+ </template>
111
+
112
+ <script>
113
+ export default {
114
+ data() {
115
+ return {
116
+ largeData: Array.from({ length: 10000 }, (_, i) => ({
117
+ id: i + 1,
118
+ name: `用户${i + 1}`,
119
+ age: Math.floor(Math.random() * 50) + 20,
120
+ city: ['北京', '上海', '广州', '深圳'][Math.floor(Math.random() * 4)]
121
+ })),
122
+ columns: [
123
+ { prop: 'id', label: 'ID', width: 80 },
124
+ { prop: 'name', label: '姓名', width: 120 },
125
+ { prop: 'age', label: '年龄', width: 80 },
126
+ { prop: 'city', label: '城市', width: 100 }
127
+ ]
128
+ }
129
+ }
130
+ }
131
+ </script>
132
+ ```
133
+ :::
134
+
135
+ ### 合并单元格
136
+
137
+ ::: demo 合并单元格
138
+ ```vue
139
+ <template>
140
+ <XtTable
141
+ :table-data="tableData"
142
+ :columns="columns"
143
+ :group-columns="['city']"
144
+ title="按城市分组"
145
+ />
146
+ </template>
147
+
148
+ <script>
149
+ export default {
150
+ data() {
151
+ return {
152
+ tableData: [
153
+ { city: '北京', name: '张三', age: 25 },
154
+ { city: '北京', name: '李四', age: 30 },
155
+ { city: '上海', name: '王五', age: 28 },
156
+ { city: '上海', name: '赵六', age: 32 }
157
+ ],
158
+ columns: [
159
+ { prop: 'city', label: '城市' },
160
+ { prop: 'name', label: '姓名' },
161
+ { prop: 'age', label: '年龄' }
162
+ ]
163
+ }
164
+ }
165
+ }
166
+ </script>
167
+ ```
168
+ :::
169
+
170
+ ### 小计和总计
171
+
172
+ ::: demo 小计和总计
173
+ ```vue
174
+ <template>
175
+ <XtTable
176
+ :table-data="tableData"
177
+ :columns="columns"
178
+ :group-columns="['category']"
179
+ :subtotal-config="subtotalConfig"
180
+ :total-config="totalConfig"
181
+ title="销售统计"
182
+ />
183
+ </template>
184
+
185
+ <script>
186
+ export default {
187
+ data() {
188
+ return {
189
+ tableData: [
190
+ { category: '电子产品', name: '手机', price: 5999, count: 10 },
191
+ { category: '电子产品', name: '电脑', price: 8999, count: 5 },
192
+ { category: '日用品', name: '牙刷', price: 20, count: 100 },
193
+ { category: '日用品', name: '毛巾', price: 30, count: 50 }
194
+ ],
195
+ columns: [
196
+ { prop: 'category', label: '分类' },
197
+ { prop: 'name', label: '名称' },
198
+ { prop: 'price', label: '单价' },
199
+ { prop: 'count', label: '数量' }
200
+ ],
201
+ subtotalConfig: {
202
+ enabled: true,
203
+ groupBy: ['category'],
204
+ labelText: '小计',
205
+ columns: {
206
+ price: 'sum',
207
+ count: 'sum'
208
+ }
209
+ },
210
+ totalConfig: {
211
+ enabled: true,
212
+ labelText: '总计',
213
+ columns: {
214
+ price: 'sum',
215
+ count: 'sum'
216
+ }
217
+ }
218
+ }
219
+ }
220
+ }
221
+ </script>
222
+ ```
223
+ :::
224
+
225
+ ### 分页
226
+
227
+ ::: demo 分页
228
+ ```vue
229
+ <template>
230
+ <XtTable
231
+ :table-data="tableData"
232
+ :columns="columns"
233
+ :pagination="pagination"
234
+ :total="100"
235
+ title="带分页表格"
236
+ @size-change="handleSizeChange"
237
+ @page-change="handlePageChange"
238
+ />
239
+ </template>
240
+
241
+ <script>
242
+ export default {
243
+ data() {
244
+ return {
245
+ tableData: [
246
+ { name: '张三', age: 25, city: '北京' },
247
+ { name: '李四', age: 30, city: '上海' }
248
+ ],
249
+ columns: [
250
+ { prop: 'name', label: '姓名' },
251
+ { prop: 'age', label: '年龄' },
252
+ { prop: 'city', label: '城市' }
253
+ ],
254
+ pagination: {
255
+ pageNum: 1,
256
+ pageSize: 20,
257
+ pageSizes: [10, 20, 50, 100]
258
+ }
259
+ }
260
+ },
261
+ methods: {
262
+ handleSizeChange(size) {
263
+ this.pagination.pageSize = size
264
+ },
265
+ handlePageChange(page) {
266
+ this.pagination.pageNum = page
267
+ }
268
+ }
269
+ }
270
+ </script>
271
+ ```
272
+ :::
273
+
274
+ ### 自定义渲染
275
+
276
+ ::: demo 自定义渲染
277
+ ```vue
278
+ <template>
279
+ <XtTable :table-data="tableData" :columns="columns">
280
+ <template #action="{ row }">
281
+ <XtButton size="small" @click="edit(row)">编辑</XtButton>
282
+ <XtButton size="small" type="danger" @click="del(row)">删除</XtButton>
283
+ </template>
284
+ </XtTable>
285
+ </template>
286
+
287
+ <script>
288
+ export default {
289
+ data() {
290
+ return {
291
+ tableData: [
292
+ { id: 1, name: '张三', status: 1 },
293
+ { id: 2, name: '李四', status: 0 }
294
+ ],
295
+ columns: [
296
+ { prop: 'id', label: 'ID' },
297
+ { prop: 'name', label: '姓名' },
298
+ {
299
+ prop: 'status',
300
+ label: '状态',
301
+ formatter: (row) => row.status === 1 ? '正常' : '禁用'
302
+ },
303
+ { label: '操作', slot: 'action' }
304
+ ]
305
+ }
306
+ },
307
+ methods: {
308
+ edit(row) {
309
+ console.log('编辑', row)
310
+ },
311
+ del(row) {
312
+ console.log('删除', row)
313
+ }
314
+ }
315
+ }
316
+ </script>
317
+ ```
318
+ :::
319
+
320
+ ## 事件
321
+
322
+ | 事件名 | 说明 | 参数 |
323
+ |--------|------|------|
324
+ | `selection-change` | 选择项变化 | `selectedRows` |
325
+ | `sort-change` | 排序变化 | `sortInfo` |
326
+ | `size-change` | 每页条数变化 | `size` |
327
+ | `page-change` | 当前页变化 | `page` |
328
+
329
+ ## 方法
330
+
331
+ | 方法名 | 说明 | 参数 |
332
+ |--------|------|------|
333
+ | `getSelection` | 获取选中行 | - |
334
+ | `clearSelection` | 清除选中 | - |
335
+ | `toggleRowSelection` | 切换行选中状态 | `row`, `selected` |
336
+ | `toggleRowsSelection` | 批量切换行选中状态 | `rows`, `selected` |
337
+ | `doLayout` | 重新计算布局 | - |
338
+
339
+ ## 插槽
340
+
341
+ | 插槽名 | 说明 |
342
+ |--------|------|
343
+ | `toolbar` | 工具栏区域(标题右侧) |
344
344
  | `{slotName}` | 自定义列插槽(通过 column.slot 配置) |