xt-element-ui 2.0.5 → 2.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/docs/components/base/xt-card-item.md +1 -1
- package/docs/components/base/xt-list.md +459 -0
- package/docs/components/base/xt-table.md +120 -0
- package/lib/index.common.js +713 -127
- package/lib/index.css +1 -1
- package/lib/index.umd.js +713 -127
- package/lib/index.umd.min.js +4 -4
- package/package.json +3 -3
- package/src/components/xt-button/index.vue +3 -3
- package/src/components/xt-button/style/index.scss +5 -5
- package/src/components/xt-card/index.vue +4 -4
- package/src/components/xt-card/style/index.scss +11 -11
- package/src/components/xt-chart/XtLine.vue +2 -8
- package/src/components/xt-chart/theme/dark.js +15 -9
- package/src/components/xt-chart/theme/white.js +4 -8
- package/src/components/xt-list/index.js +8 -0
- package/src/components/xt-list/index.vue +886 -0
- package/src/components/xt-table/index copy.vue +663 -0
- package/src/components/xt-table/index.vue +120 -24
- package/src/index.js +3 -0
- package/src/components/xt-card-item/style/index copy.scss +0 -72
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
```vue
|
|
94
94
|
<template>
|
|
95
95
|
<XtCard title="统计数据">
|
|
96
|
-
<div style="display: flex; flex-direction: column; gap: 8px;
|
|
96
|
+
<div style="display: flex; flex-direction: column; gap: 8px;width: 350px;">
|
|
97
97
|
<XtCardItem title="总销售额" value="123456" unit="元"></XtCardItem>
|
|
98
98
|
<XtCardItem title="订单数量" value="520" unit="单" type="success"></XtCardItem>
|
|
99
99
|
<XtCardItem title="转化率" value="23.5" unit="%" type="warning"></XtCardItem>
|
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
## XtList 卡片列表组件
|
|
2
|
+
|
|
3
|
+
基于 ElementUI Card 封装的列表渲染组件,一个卡片代表一条数据,支持分组、虚拟滚动、搜索筛选、排序等功能。
|
|
4
|
+
|
|
5
|
+
### 基本用法
|
|
6
|
+
|
|
7
|
+
::: demo 基本用法
|
|
8
|
+
```vue
|
|
9
|
+
<template>
|
|
10
|
+
<XtList
|
|
11
|
+
:data="listData"
|
|
12
|
+
title="订单列表"
|
|
13
|
+
/>
|
|
14
|
+
</template>
|
|
15
|
+
|
|
16
|
+
<script>
|
|
17
|
+
export default {
|
|
18
|
+
data() {
|
|
19
|
+
return {
|
|
20
|
+
listData: [
|
|
21
|
+
{ id: 1, title: '订单 #001', subtitle: '2024-01-15', content: '金额: ¥299.00', footer: '已完成' },
|
|
22
|
+
{ id: 2, title: '订单 #002', subtitle: '2024-01-16', content: '金额: ¥599.00', footer: '待发货' },
|
|
23
|
+
{ id: 3, title: '订单 #003', subtitle: '2024-01-17', content: '金额: ¥199.00', footer: '已完成' }
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
</script>
|
|
29
|
+
```
|
|
30
|
+
:::
|
|
31
|
+
|
|
32
|
+
### 分组展示
|
|
33
|
+
|
|
34
|
+
::: demo 分组展示
|
|
35
|
+
```vue
|
|
36
|
+
<template>
|
|
37
|
+
<XtList
|
|
38
|
+
:data="listData"
|
|
39
|
+
group-by="status"
|
|
40
|
+
title="订单列表(按状态分组)"
|
|
41
|
+
/>
|
|
42
|
+
</template>
|
|
43
|
+
|
|
44
|
+
<script>
|
|
45
|
+
export default {
|
|
46
|
+
data() {
|
|
47
|
+
return {
|
|
48
|
+
listData: [
|
|
49
|
+
{ id: 1, title: '订单 #001', status: '已完成', content: '金额: ¥299.00' },
|
|
50
|
+
{ id: 2, title: '订单 #002', status: '待发货', content: '金额: ¥599.00' },
|
|
51
|
+
{ id: 3, title: '订单 #003', status: '已完成', content: '金额: ¥199.00' },
|
|
52
|
+
{ id: 4, title: '订单 #004', status: '待发货', content: '金额: ¥899.00' },
|
|
53
|
+
{ id: 5, title: '订单 #005', status: '已取消', content: '金额: ¥129.00' }
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
</script>
|
|
59
|
+
```
|
|
60
|
+
:::
|
|
61
|
+
|
|
62
|
+
### 手风琴模式
|
|
63
|
+
|
|
64
|
+
::: demo 手风琴模式
|
|
65
|
+
```vue
|
|
66
|
+
<template>
|
|
67
|
+
<XtList
|
|
68
|
+
:data="listData"
|
|
69
|
+
group-by="status"
|
|
70
|
+
:accordion="true"
|
|
71
|
+
title="手风琴模式(同时只展开一个分组)"
|
|
72
|
+
/>
|
|
73
|
+
</template>
|
|
74
|
+
|
|
75
|
+
<script>
|
|
76
|
+
export default {
|
|
77
|
+
data() {
|
|
78
|
+
return {
|
|
79
|
+
listData: [
|
|
80
|
+
{ id: 1, title: '订单 #001', status: '已完成', content: '金额: ¥299.00' },
|
|
81
|
+
{ id: 2, title: '订单 #002', status: '待发货', content: '金额: ¥599.00' },
|
|
82
|
+
{ id: 3, title: '订单 #003', status: '已完成', content: '金额: ¥199.00' },
|
|
83
|
+
{ id: 4, title: '订单 #004', status: '待发货', content: '金额: ¥899.00' }
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
</script>
|
|
89
|
+
```
|
|
90
|
+
:::
|
|
91
|
+
|
|
92
|
+
### 自定义卡片配置
|
|
93
|
+
|
|
94
|
+
通过 `cardConfig` 配置字段映射,自动渲染卡片内容。
|
|
95
|
+
|
|
96
|
+
::: demo 自定义卡片配置
|
|
97
|
+
```vue
|
|
98
|
+
<template>
|
|
99
|
+
<XtList
|
|
100
|
+
:data="listData"
|
|
101
|
+
:card-config="cardConfig"
|
|
102
|
+
title="商品列表"
|
|
103
|
+
/>
|
|
104
|
+
</template>
|
|
105
|
+
|
|
106
|
+
<script>
|
|
107
|
+
export default {
|
|
108
|
+
data() {
|
|
109
|
+
return {
|
|
110
|
+
listData: [
|
|
111
|
+
{ id: 1, name: 'iPhone 15', price: 5999, desc: '全新 A17 Pro 芯片', tag: '热卖', tagType: 'danger' },
|
|
112
|
+
{ id: 2, name: 'MacBook Pro', price: 12999, desc: 'M3 Pro 芯片', tag: '新品', tagType: 'success' },
|
|
113
|
+
{ id: 3, name: 'AirPods Pro', price: 1899, desc: '主动降噪', tag: '推荐', tagType: '' }
|
|
114
|
+
],
|
|
115
|
+
cardConfig: {
|
|
116
|
+
title: 'name',
|
|
117
|
+
subtitle: 'price',
|
|
118
|
+
content: 'desc',
|
|
119
|
+
tag: 'tag',
|
|
120
|
+
tagType: 'tagType',
|
|
121
|
+
footer: 'price'
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
</script>
|
|
127
|
+
```
|
|
128
|
+
:::
|
|
129
|
+
|
|
130
|
+
### 自定义渲染(插槽)
|
|
131
|
+
|
|
132
|
+
::: demo 自定义渲染
|
|
133
|
+
```vue
|
|
134
|
+
<template>
|
|
135
|
+
<XtList :data="listData" title="自定义卡片内容">
|
|
136
|
+
<template #default="{ item, index }">
|
|
137
|
+
<div style="display: flex; align-items: center; gap: 12px;">
|
|
138
|
+
<div style="width: 48px; height: 48px; background: #409eff; border-radius: 8px; display: flex; align-items: center; justify-content: center; color: #fff; font-size: 20px; flex-shrink: 0;">
|
|
139
|
+
{{ index + 1 }}
|
|
140
|
+
</div>
|
|
141
|
+
<div style="flex: 1; min-width: 0;">
|
|
142
|
+
<div style="font-weight: 600; font-size: 15px; color: #303133; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">{{ item.name }}</div>
|
|
143
|
+
<div style="font-size: 13px; color: #909399; margin-top: 4px;">{{ item.desc }}</div>
|
|
144
|
+
</div>
|
|
145
|
+
<XtButton size="small" type="primary" plain>查看</XtButton>
|
|
146
|
+
</div>
|
|
147
|
+
</template>
|
|
148
|
+
</XtList>
|
|
149
|
+
</template>
|
|
150
|
+
|
|
151
|
+
<script>
|
|
152
|
+
export default {
|
|
153
|
+
data() {
|
|
154
|
+
return {
|
|
155
|
+
listData: [
|
|
156
|
+
{ id: 1, name: 'iPhone 15', desc: '全新 A17 Pro 芯片' },
|
|
157
|
+
{ id: 2, name: 'MacBook Pro', desc: 'M3 Pro 芯片' },
|
|
158
|
+
{ id: 3, name: 'AirPods Pro', desc: '主动降噪' }
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
</script>
|
|
164
|
+
```
|
|
165
|
+
:::
|
|
166
|
+
|
|
167
|
+
### 虚拟滚动
|
|
168
|
+
|
|
169
|
+
大数据量场景下启用虚拟滚动,仅渲染可见区域的卡片。
|
|
170
|
+
|
|
171
|
+
::: demo 虚拟滚动
|
|
172
|
+
```vue
|
|
173
|
+
<template>
|
|
174
|
+
<XtList
|
|
175
|
+
:data="largeData"
|
|
176
|
+
:height="500"
|
|
177
|
+
:item-height="140"
|
|
178
|
+
:virtual-scroll="true"
|
|
179
|
+
title="虚拟滚动(10000条数据)"
|
|
180
|
+
/>
|
|
181
|
+
</template>
|
|
182
|
+
|
|
183
|
+
<script>
|
|
184
|
+
export default {
|
|
185
|
+
data() {
|
|
186
|
+
const items = []
|
|
187
|
+
for (let i = 0; i < 10000; i++) {
|
|
188
|
+
items.push({
|
|
189
|
+
id: i + 1,
|
|
190
|
+
title: `数据项 #${i + 1}`,
|
|
191
|
+
subtitle: `分类 ${Math.floor(Math.random() * 10) + 1}`,
|
|
192
|
+
content: `这是第 ${i + 1} 条数据的描述内容`
|
|
193
|
+
})
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
largeData: items
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
</script>
|
|
201
|
+
```
|
|
202
|
+
:::
|
|
203
|
+
|
|
204
|
+
### 搜索筛选
|
|
205
|
+
|
|
206
|
+
::: demo 搜索筛选
|
|
207
|
+
```vue
|
|
208
|
+
<template>
|
|
209
|
+
<XtList
|
|
210
|
+
:data="listData"
|
|
211
|
+
:filterable="true"
|
|
212
|
+
filter-placeholder="搜索订单..."
|
|
213
|
+
title="订单列表"
|
|
214
|
+
/>
|
|
215
|
+
</template>
|
|
216
|
+
|
|
217
|
+
<script>
|
|
218
|
+
export default {
|
|
219
|
+
data() {
|
|
220
|
+
return {
|
|
221
|
+
listData: [
|
|
222
|
+
{ id: 1, title: '手机订单', content: '¥2999.00' },
|
|
223
|
+
{ id: 2, title: '电脑订单', content: '¥8999.00' },
|
|
224
|
+
{ id: 3, title: '耳机订单', content: '¥599.00' },
|
|
225
|
+
{ id: 4, title: '平板订单', content: '¥3499.00' },
|
|
226
|
+
{ id: 5, title: '键盘订单', content: '¥299.00' }
|
|
227
|
+
]
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
</script>
|
|
232
|
+
```
|
|
233
|
+
:::
|
|
234
|
+
|
|
235
|
+
### 排序
|
|
236
|
+
|
|
237
|
+
::: demo 排序
|
|
238
|
+
```vue
|
|
239
|
+
<template>
|
|
240
|
+
<XtList
|
|
241
|
+
:data="listData"
|
|
242
|
+
:sortable="true"
|
|
243
|
+
sort-by="price"
|
|
244
|
+
title="商品列表(按价格排序)"
|
|
245
|
+
/>
|
|
246
|
+
</template>
|
|
247
|
+
|
|
248
|
+
<script>
|
|
249
|
+
export default {
|
|
250
|
+
data() {
|
|
251
|
+
return {
|
|
252
|
+
listData: [
|
|
253
|
+
{ id: 1, title: '商品A', price: 299 },
|
|
254
|
+
{ id: 2, title: '商品B', price: 599 },
|
|
255
|
+
{ id: 3, title: '商品C', price: 199 },
|
|
256
|
+
{ id: 4, title: '商品D', price: 899 },
|
|
257
|
+
{ id: 5, title: '商品E', price: 399 }
|
|
258
|
+
]
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
</script>
|
|
263
|
+
```
|
|
264
|
+
:::
|
|
265
|
+
|
|
266
|
+
### 多列布局
|
|
267
|
+
|
|
268
|
+
::: demo 多列布局
|
|
269
|
+
```vue
|
|
270
|
+
<template>
|
|
271
|
+
<XtList
|
|
272
|
+
:data="listData"
|
|
273
|
+
:columns="2"
|
|
274
|
+
title="双列商品列表"
|
|
275
|
+
/>
|
|
276
|
+
</template>
|
|
277
|
+
|
|
278
|
+
<script>
|
|
279
|
+
export default {
|
|
280
|
+
data() {
|
|
281
|
+
return {
|
|
282
|
+
listData: [
|
|
283
|
+
{ id: 1, title: '商品 1', content: '¥99.00' },
|
|
284
|
+
{ id: 2, title: '商品 2', content: '¥199.00' },
|
|
285
|
+
{ id: 3, title: '商品 3', content: '¥299.00' },
|
|
286
|
+
{ id: 4, title: '商品 4', content: '¥399.00' }
|
|
287
|
+
]
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
</script>
|
|
292
|
+
```
|
|
293
|
+
:::
|
|
294
|
+
|
|
295
|
+
### 加载更多
|
|
296
|
+
|
|
297
|
+
::: demo 加载更多
|
|
298
|
+
```vue
|
|
299
|
+
<template>
|
|
300
|
+
<XtList
|
|
301
|
+
:data="listData"
|
|
302
|
+
:load-more="true"
|
|
303
|
+
:has-more="hasMore"
|
|
304
|
+
load-more-text="点击加载更多"
|
|
305
|
+
title="商品列表"
|
|
306
|
+
@load-more="handleLoadMore"
|
|
307
|
+
/>
|
|
308
|
+
</template>
|
|
309
|
+
|
|
310
|
+
<script>
|
|
311
|
+
export default {
|
|
312
|
+
data() {
|
|
313
|
+
return {
|
|
314
|
+
listData: [],
|
|
315
|
+
hasMore: true,
|
|
316
|
+
page: 1
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
created() {
|
|
320
|
+
this.loadData()
|
|
321
|
+
},
|
|
322
|
+
methods: {
|
|
323
|
+
loadData() {
|
|
324
|
+
const newItems = Array.from({ length: 10 }, (_, i) => ({
|
|
325
|
+
id: (this.page - 1) * 10 + i + 1,
|
|
326
|
+
title: `商品 #${(this.page - 1) * 10 + i + 1}`,
|
|
327
|
+
content: `¥${Math.floor(Math.random() * 1000) + 100}.00`
|
|
328
|
+
}))
|
|
329
|
+
this.listData = [...this.listData, ...newItems]
|
|
330
|
+
this.page++
|
|
331
|
+
this.hasMore = this.page <= 3
|
|
332
|
+
},
|
|
333
|
+
handleLoadMore() {
|
|
334
|
+
setTimeout(() => {
|
|
335
|
+
this.loadData()
|
|
336
|
+
}, 500)
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
</script>
|
|
341
|
+
```
|
|
342
|
+
:::
|
|
343
|
+
|
|
344
|
+
## 属性说明
|
|
345
|
+
|
|
346
|
+
### 基础属性
|
|
347
|
+
|
|
348
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
349
|
+
|------|------|--------|------|
|
|
350
|
+
| `data` | Array | `[]` | 列表数据 |
|
|
351
|
+
| `title` | String | `''` | 列表标题 |
|
|
352
|
+
| `columns` | Number | `1` | 列数(1/2/3) |
|
|
353
|
+
| `shadow` | String | `'hover'` | 卡片阴影('always' / 'hover' / 'never') |
|
|
354
|
+
| `cardBodyStyle` | Object | `{}` | 卡片 body 样式 |
|
|
355
|
+
| `loading` | Boolean | `false` | 是否加载中 |
|
|
356
|
+
| `emptyText` | String | `'暂无数据'` | 空数据提示 |
|
|
357
|
+
|
|
358
|
+
### 分组配置
|
|
359
|
+
|
|
360
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
361
|
+
|------|------|--------|------|
|
|
362
|
+
| `groupBy` | String | `''` | 分组字段名 |
|
|
363
|
+
| `groupLabel` | String / Function | `''` | 分组标题(空字符串显示分组值,字符串为字段名,函数返回自定义内容) |
|
|
364
|
+
| `expandAll` | Boolean | `true` | 是否默认展开所有分组 |
|
|
365
|
+
| `accordion` | Boolean | `false` | 手风琴模式(同时只展开一个分组) |
|
|
366
|
+
|
|
367
|
+
### 卡片配置
|
|
368
|
+
|
|
369
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
370
|
+
|------|------|--------|------|
|
|
371
|
+
| `cardConfig` | Object | `{ title: 'title', ... }` | 卡片字段映射配置 |
|
|
372
|
+
|
|
373
|
+
cardConfig 子属性:
|
|
374
|
+
|
|
375
|
+
| 属性 | 类型 | 说明 |
|
|
376
|
+
|------|------|------|
|
|
377
|
+
| `title` | String / Function | 卡片标题字段 |
|
|
378
|
+
| `subtitle` | String / Function | 卡片副标题字段 |
|
|
379
|
+
| `content` | String / Function | 卡片内容字段 |
|
|
380
|
+
| `image` | String / Function | 卡片图片字段 |
|
|
381
|
+
| `tag` | String / Function | 卡片标签字段 |
|
|
382
|
+
| `tagType` | String / Function | 标签类型 |
|
|
383
|
+
| `footer` | String / Function | 卡片底部字段 |
|
|
384
|
+
|
|
385
|
+
### 虚拟滚动
|
|
386
|
+
|
|
387
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
388
|
+
|------|------|--------|------|
|
|
389
|
+
| `virtualScroll` | Boolean | `false` | 是否启用虚拟滚动 |
|
|
390
|
+
| `height` | Number / String | - | 容器高度 |
|
|
391
|
+
| `maxHeight` | Number / String | - | 容器最大高度 |
|
|
392
|
+
| `itemHeight` | Number | `160` | 每行卡片预估高度 |
|
|
393
|
+
| `bufferSize` | Number | `3` | 缓冲区行数 |
|
|
394
|
+
|
|
395
|
+
### 搜索筛选
|
|
396
|
+
|
|
397
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
398
|
+
|------|------|--------|------|
|
|
399
|
+
| `filterable` | Boolean | `false` | 是否启用搜索 |
|
|
400
|
+
| `filterPlaceholder` | String | `'请输入搜索内容'` | 搜索框占位文本 |
|
|
401
|
+
| `filterMethod` | Function | - | 自定义筛选方法 `(item, searchText) => boolean` |
|
|
402
|
+
|
|
403
|
+
### 排序
|
|
404
|
+
|
|
405
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
406
|
+
|------|------|--------|------|
|
|
407
|
+
| `sortable` | Boolean | `false` | 是否启用排序 |
|
|
408
|
+
| `sortBy` | String | `''` | 排序字段 |
|
|
409
|
+
| `sortOrder` | String | `''` | 默认排序方向('ascending' / 'descending') |
|
|
410
|
+
| `sortMethod` | Function | - | 自定义排序方法 `(a, b) => number` |
|
|
411
|
+
|
|
412
|
+
### 加载更多
|
|
413
|
+
|
|
414
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
415
|
+
|------|------|--------|------|
|
|
416
|
+
| `loadMore` | Boolean | `false` | 是否启用加载更多 |
|
|
417
|
+
| `hasMore` | Boolean | `false` | 是否有更多数据 |
|
|
418
|
+
| `loadMoreText` | String | `'加载更多'` | 加载更多按钮文本 |
|
|
419
|
+
| `loadMoreLoading` | Boolean | `false` | 加载更多按钮加载状态 |
|
|
420
|
+
|
|
421
|
+
### 分页
|
|
422
|
+
|
|
423
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
424
|
+
|------|------|--------|------|
|
|
425
|
+
| `pagination` | Object | `null` | 分页配置 `{ pageNum, pageSize, pageSizes }` |
|
|
426
|
+
| `total` | Number | `0` | 数据总数 |
|
|
427
|
+
|
|
428
|
+
## 事件
|
|
429
|
+
|
|
430
|
+
| 事件名 | 说明 | 参数 |
|
|
431
|
+
|--------|------|------|
|
|
432
|
+
| `click-item` | 点击卡片 | `{ item, groupKey }` |
|
|
433
|
+
| `group-toggle` | 分组展开/折叠 | `{ key, expanded }` |
|
|
434
|
+
| `search` | 搜索输入变化 | `searchText` |
|
|
435
|
+
| `sort-change` | 排序变化 | `{ prop, order }` |
|
|
436
|
+
| `load-more` | 点击加载更多 | - |
|
|
437
|
+
| `size-change` | 每页条数变化 | `size` |
|
|
438
|
+
| `page-change` | 当前页变化 | `page` |
|
|
439
|
+
|
|
440
|
+
## 方法
|
|
441
|
+
|
|
442
|
+
| 方法名 | 说明 | 参数 |
|
|
443
|
+
|--------|------|------|
|
|
444
|
+
| `scrollToTop()` | 滚动到顶部 | - |
|
|
445
|
+
| `expandGroup(key)` | 展开指定分组 | `key` |
|
|
446
|
+
| `collapseGroup(key)` | 折叠指定分组 | `key` |
|
|
447
|
+
| `collapseAll()` | 折叠所有分组 | - |
|
|
448
|
+
| `expandAllGroups()` | 展开所有分组 | - |
|
|
449
|
+
|
|
450
|
+
## 插槽
|
|
451
|
+
|
|
452
|
+
| 插槽名 | 作用域 | 说明 |
|
|
453
|
+
|--------|--------|------|
|
|
454
|
+
| `default` | `{ item, index, group }` | 自定义卡片内容 |
|
|
455
|
+
| `group-title` | `{ group, items, expanded }` | 自定义分组标题 |
|
|
456
|
+
| `card-footer` | `{ item, index }` | 自定义卡片底部 |
|
|
457
|
+
| `toolbar` | - | 工具栏区域(搜索和排序按钮右侧) |
|
|
458
|
+
| `empty` | - | 自定义空状态 |
|
|
459
|
+
| `loading` | - | 自定义加载状态 |
|
|
@@ -76,6 +76,13 @@ export default {
|
|
|
76
76
|
| `pagination` | Object | `null` | 分页配置 |
|
|
77
77
|
| `total` | Number | `0` | 数据总数 |
|
|
78
78
|
|
|
79
|
+
### 排序
|
|
80
|
+
|
|
81
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
82
|
+
|------|------|--------|------|
|
|
83
|
+
| `sortGroup` | Boolean | `false` | 是否启用分组内排序 |
|
|
84
|
+
| `defaultSort` | Object | `null` | 默认排序配置 `{ prop, order }` |
|
|
85
|
+
|
|
79
86
|
## 列配置说明
|
|
80
87
|
|
|
81
88
|
```javascript
|
|
@@ -222,6 +229,119 @@ export default {
|
|
|
222
229
|
```
|
|
223
230
|
:::
|
|
224
231
|
|
|
232
|
+
### 排序
|
|
233
|
+
|
|
234
|
+
列配置中设置 `sortable: true` 即可启用排序。支持普通排序和分组内排序。
|
|
235
|
+
|
|
236
|
+
::: demo 普通排序
|
|
237
|
+
```vue
|
|
238
|
+
<template>
|
|
239
|
+
<XtTable
|
|
240
|
+
:table-data="tableData"
|
|
241
|
+
:columns="columns"
|
|
242
|
+
title="支持排序的表格"
|
|
243
|
+
/>
|
|
244
|
+
</template>
|
|
245
|
+
|
|
246
|
+
<script>
|
|
247
|
+
export default {
|
|
248
|
+
data() {
|
|
249
|
+
return {
|
|
250
|
+
tableData: [
|
|
251
|
+
{ name: '张三', age: 25, score: 88 },
|
|
252
|
+
{ name: '李四', age: 30, score: 95 },
|
|
253
|
+
{ name: '王五', age: 28, score: 76 },
|
|
254
|
+
{ name: '赵六', age: 22, score: 82 }
|
|
255
|
+
],
|
|
256
|
+
columns: [
|
|
257
|
+
{ prop: 'name', label: '姓名' },
|
|
258
|
+
{ prop: 'age', label: '年龄', sortable: true },
|
|
259
|
+
{ prop: 'score', label: '分数', sortable: true }
|
|
260
|
+
]
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
</script>
|
|
265
|
+
```
|
|
266
|
+
:::
|
|
267
|
+
|
|
268
|
+
::: demo 分组内排序
|
|
269
|
+
```vue
|
|
270
|
+
<template>
|
|
271
|
+
<XtTable
|
|
272
|
+
:table-data="tableData"
|
|
273
|
+
:columns="columns"
|
|
274
|
+
:group-columns="['city']"
|
|
275
|
+
:sort-group="true"
|
|
276
|
+
title="分组后组内排序"
|
|
277
|
+
/>
|
|
278
|
+
</template>
|
|
279
|
+
|
|
280
|
+
<script>
|
|
281
|
+
export default {
|
|
282
|
+
data() {
|
|
283
|
+
return {
|
|
284
|
+
tableData: [
|
|
285
|
+
{ city: '北京', name: '张三', age: 25 },
|
|
286
|
+
{ city: '北京', name: '李四', age: 30 },
|
|
287
|
+
{ city: '北京', name: '王五', age: 28 },
|
|
288
|
+
{ city: '上海', name: '赵六', age: 22 },
|
|
289
|
+
{ city: '上海', name: '孙七', age: 35 },
|
|
290
|
+
{ city: '广州', name: '周八', age: 27 }
|
|
291
|
+
],
|
|
292
|
+
columns: [
|
|
293
|
+
{ prop: 'city', label: '城市' },
|
|
294
|
+
{ prop: 'name', label: '姓名' },
|
|
295
|
+
{ prop: 'age', label: '年龄', sortable: true }
|
|
296
|
+
]
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
</script>
|
|
301
|
+
```
|
|
302
|
+
:::
|
|
303
|
+
|
|
304
|
+
::: demo 默认排序和自定义排序
|
|
305
|
+
```vue
|
|
306
|
+
<template>
|
|
307
|
+
<XtTable
|
|
308
|
+
:table-data="tableData"
|
|
309
|
+
:columns="columns"
|
|
310
|
+
:default-sort="{ prop: 'score', order: 'descending' }"
|
|
311
|
+
title="默认按分数降序排列"
|
|
312
|
+
/>
|
|
313
|
+
</template>
|
|
314
|
+
|
|
315
|
+
<script>
|
|
316
|
+
export default {
|
|
317
|
+
data() {
|
|
318
|
+
return {
|
|
319
|
+
tableData: [
|
|
320
|
+
{ name: '张三', score: 88, level: 'B' },
|
|
321
|
+
{ name: '李四', score: 95, level: 'A' },
|
|
322
|
+
{ name: '王五', score: 76, level: 'C' },
|
|
323
|
+
{ name: '赵六', score: 82, level: 'B' }
|
|
324
|
+
],
|
|
325
|
+
columns: [
|
|
326
|
+
{ prop: 'name', label: '姓名' },
|
|
327
|
+
{ prop: 'score', label: '分数', sortable: true },
|
|
328
|
+
{
|
|
329
|
+
prop: 'level',
|
|
330
|
+
label: '等级',
|
|
331
|
+
sortable: true,
|
|
332
|
+
sortMethod: (a, b) => {
|
|
333
|
+
const order = { 'A': 3, 'B': 2, 'C': 1 }
|
|
334
|
+
return (order[a.level] || 0) - (order[b.level] || 0)
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
]
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
</script>
|
|
342
|
+
```
|
|
343
|
+
:::
|
|
344
|
+
|
|
225
345
|
### 分页
|
|
226
346
|
|
|
227
347
|
::: demo 分页
|