@aspire-ui/element-component-pro 1.0.26 → 1.0.27
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/dist/ProTableForm/CellEditor.vue.d.ts +5 -1
- package/dist/element-component-pro.es.js +447 -445
- package/dist/element-component-pro.es.js.map +1 -1
- package/dist/element-component-pro.umd.js +2 -2
- package/dist/element-component-pro.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/index.d.ts +16 -11
- package/docs/CollapseContainer.md +100 -0
- package/docs/ComponentSetting.md +113 -0
- package/docs/ProDescriptions.md +215 -0
- package/docs/ProForm.md +879 -0
- package/docs/ProTable-Redesign.md +214 -0
- package/docs/ProTable.md +556 -0
- package/docs/ProTableForm.md +207 -0
- package/docs/image.png +0 -0
- package/package.json +3 -2
- package/src/CollapseContainer/CollapseContainer.vue +1 -1
- package/src/ProDescriptions/ProDescriptions.vue +1 -1
- package/src/ProForm/FormActions.vue +1 -1
- package/src/ProForm/ProForm.vue +1 -1
- package/src/ProForm/ProFormItem.vue +1 -1
- package/src/ProForm/TreeSelect.vue +1 -1
- package/src/ProTable/ProTable.vue +1 -1
- package/src/ProTable/TableAction.vue +1 -1
- package/src/ProTableForm/CellEditor.vue +15 -11
- package/src/ProTableForm/ProTableForm.vue +3 -2
- package/src/types/index.ts +17 -11
package/docs/ProTable.md
ADDED
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
# ProTable 表格组件
|
|
2
|
+
|
|
3
|
+
基于 Element UI Table 的二次封装,参考 [Vben Admin BasicTable](https://doc.vvbin.cn/components/table.html),对齐其 API 设计和使用体验,支持:
|
|
4
|
+
|
|
5
|
+
- 列配置(`ProColumn`)与多级表头
|
|
6
|
+
- API 请求 / 本地数据双模式
|
|
7
|
+
- 分页、选择列、序号列、操作列
|
|
8
|
+
- 跨分页选择、树形表格、合并单元格
|
|
9
|
+
- `useProTable` 编程式控制(`tableAction`)
|
|
10
|
+
- 组件默认配置(`useComponentSetting`)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 基础用法(本地数据)
|
|
15
|
+
|
|
16
|
+
传入 `dataSource` 即为本地模式,数据由前端管理,不走接口请求。配合 `pagination` 使用时,分页变化会自动对全量数据做切片,每次只渲染当前页数据。
|
|
17
|
+
|
|
18
|
+
```vue
|
|
19
|
+
<template>
|
|
20
|
+
<ProTable
|
|
21
|
+
title="本地分页示例"
|
|
22
|
+
:columns="columns"
|
|
23
|
+
:data-source="data"
|
|
24
|
+
:pagination="{ pageSize: 10 }"
|
|
25
|
+
/>
|
|
26
|
+
</template>
|
|
27
|
+
|
|
28
|
+
<script setup lang="ts">
|
|
29
|
+
const data = Array.from({ length: 100 }, (_, i) => ({
|
|
30
|
+
id: i + 1,
|
|
31
|
+
name: `用户${i + 1}`,
|
|
32
|
+
age: 20 + (i % 50),
|
|
33
|
+
}))
|
|
34
|
+
</script>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 本地筛选后重新注入
|
|
38
|
+
|
|
39
|
+
搜索/筛选后,用 `tableAction.setTableData` 重新注入过滤后的全量数据,`total` 会自动同步:
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
const handleSearch = (keyword: string) => {
|
|
43
|
+
const filtered = allData.filter(item => item.name.includes(keyword))
|
|
44
|
+
tableAction.setTableData(filtered)
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 列宽配置
|
|
51
|
+
|
|
52
|
+
`ProColumn.width` 支持三种形式:
|
|
53
|
+
|
|
54
|
+
| 类型 | 示例 | 说明 |
|
|
55
|
+
|------|------|------|
|
|
56
|
+
| **固定像素** | `width: 120` 或 `width: '120px'` | 精确指定列宽 |
|
|
57
|
+
| **比例分配** | `width: 1` / `width: 2` | 按比例均分可用宽度(见下方说明) |
|
|
58
|
+
| **最小宽度** | `minWidth: 200` | 列不撑满时保持该宽度,超出时自适应 |
|
|
59
|
+
|
|
60
|
+
### 比例宽度(number)
|
|
61
|
+
|
|
62
|
+
当 `width` 为 `number` 类型时,视为比例权重,会根据容器总宽度**自动计算**像素值:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
某列像素宽度 = (容器宽度 - 固定列宽 - 固定数据列宽) × (该列 width / 所有比例列 width 总和)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- **固定列**包括:选择列(rowSelection)、序号列(showIndexColumn)、操作列(actionColumn)
|
|
69
|
+
- **固定数据列**包括:`width` 为 `string` 类型的列
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
const columns: ProColumn[] = [
|
|
73
|
+
// 三列按 1:1:1 比例分配可用宽度
|
|
74
|
+
{ title: '区域', dataIndex: 'region', width: 1 },
|
|
75
|
+
{ title: '姓名', dataIndex: 'name', width: 1 },
|
|
76
|
+
{ title: '销量', dataIndex: 'sales', width: 1 },
|
|
77
|
+
]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
> **提示**:比例宽度适合数据列均分场景;若希望列宽更宽,可使用更大的权重(如 `width: 100` 三列均分)。
|
|
81
|
+
|
|
82
|
+
### minWidth / maxWidth 约束
|
|
83
|
+
|
|
84
|
+
所有类型列均可通过 `minWidth` 和 `maxWidth` 设置边界:
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
// 最小宽度约束(比例列默认最小 60px)
|
|
88
|
+
{ title: '姓名', dataIndex: 'name', width: 1, minWidth: 100 }
|
|
89
|
+
|
|
90
|
+
// 最大宽度约束
|
|
91
|
+
{ title: '备注', dataIndex: 'remark', width: 1, maxWidth: 300 }
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## API 请求数据
|
|
97
|
+
|
|
98
|
+
`api` 返回值约定为 `{ list, total }`(与 Vben Admin 一致):
|
|
99
|
+
|
|
100
|
+
```vue
|
|
101
|
+
<template>
|
|
102
|
+
<ProTable
|
|
103
|
+
title="API 示例"
|
|
104
|
+
:columns="columns"
|
|
105
|
+
:api="fetchTableData"
|
|
106
|
+
row-key="id"
|
|
107
|
+
:pagination="{ pageSize: 10 }"
|
|
108
|
+
/>
|
|
109
|
+
</template>
|
|
110
|
+
|
|
111
|
+
<script setup lang="ts">
|
|
112
|
+
import { ProTable } from 'element-component-pro'
|
|
113
|
+
import type { ProColumn, FetchParams } from 'element-component-pro'
|
|
114
|
+
|
|
115
|
+
const columns: ProColumn[] = [
|
|
116
|
+
{ title: 'ID', dataIndex: 'id', width: 80 },
|
|
117
|
+
{ title: '姓名', dataIndex: 'name', width: 120 },
|
|
118
|
+
{ title: '年龄', dataIndex: 'age', width: 80 },
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
const fetchTableData = async (params: FetchParams & Record<string, unknown>) => {
|
|
122
|
+
const res = await api.getUserList(params)
|
|
123
|
+
return { list: res.list, total: res.total }
|
|
124
|
+
}
|
|
125
|
+
</script>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## useProTable(tableAction)
|
|
131
|
+
|
|
132
|
+
通过 `useProTable` 获取 `tableAction`,方便在外部控制表格行为。
|
|
133
|
+
|
|
134
|
+
### 不传 props
|
|
135
|
+
|
|
136
|
+
```vue
|
|
137
|
+
<template>
|
|
138
|
+
<div>
|
|
139
|
+
<el-button type="primary" size="small" @click="handleReload">刷新第一页</el-button>
|
|
140
|
+
<ProTable
|
|
141
|
+
@register="registerTable"
|
|
142
|
+
title="useProTable 示例"
|
|
143
|
+
:columns="columns"
|
|
144
|
+
:api="fetchTableData"
|
|
145
|
+
row-key="id"
|
|
146
|
+
:row-selection="{ type: 'checkbox' }"
|
|
147
|
+
/>
|
|
148
|
+
</div>
|
|
149
|
+
</template>
|
|
150
|
+
|
|
151
|
+
<script setup lang="ts">
|
|
152
|
+
import { ProTable, useProTable } from 'element-component-pro'
|
|
153
|
+
import type { ProColumn, FetchParams } from 'element-component-pro'
|
|
154
|
+
|
|
155
|
+
const columns: ProColumn[] = [
|
|
156
|
+
{ title: 'ID', dataIndex: 'id', width: 80 },
|
|
157
|
+
{ title: '姓名', dataIndex: 'name', width: 120 },
|
|
158
|
+
{ title: '年龄', dataIndex: 'age', width: 80 },
|
|
159
|
+
]
|
|
160
|
+
|
|
161
|
+
const [registerTable, tableAction] = useProTable()
|
|
162
|
+
|
|
163
|
+
const fetchTableData = async (params: FetchParams & Record<string, unknown>) => {
|
|
164
|
+
const res = await api.getUserList(params)
|
|
165
|
+
return { list: res.list, total: res.total }
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const handleReload = () => tableAction.reload({ page: 1 })
|
|
169
|
+
</script>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 传入 props(响应式同步)
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
// 方式一:静态 props,注册时一次性应用
|
|
176
|
+
const [registerTable, tableAction] = useProTable({ size: 'small', bordered: true })
|
|
177
|
+
|
|
178
|
+
// 方式二:响应式 props,后续修改会自动 setProps 到表格
|
|
179
|
+
const tableProps = ref({ size: 'small', bordered: true })
|
|
180
|
+
const [registerTable2, tableAction2] = useProTable(tableProps)
|
|
181
|
+
// 之后修改 tableProps.value.size = 'medium' 会自动同步到表格
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### TableActionType 方法
|
|
185
|
+
|
|
186
|
+
| 方法 | 说明 |
|
|
187
|
+
|------|------|
|
|
188
|
+
| `setProps(props)` | 动态更新 ProTable Props |
|
|
189
|
+
| `reload(opt?)` | 重新请求数据,支持 `{ page, pageSize, searchInfo }` |
|
|
190
|
+
| `redoHeight()` | 重新计算表格高度/布局 |
|
|
191
|
+
| `setLoading(loading)` | 手动切换 loading |
|
|
192
|
+
| `getDataSource()` | 获取全量数据(本地模式为原始数据,API 模式为服务端返回的当前页) |
|
|
193
|
+
| `getRawDataSource()` | 获取接口原始返回数据 |
|
|
194
|
+
| `setTableData(data)` | 设置本地全量数据,自动同步 total |
|
|
195
|
+
| `getColumns()` / `setColumns(cols)` | 获取/设置列配置 |
|
|
196
|
+
| `setPagination(info)` | 设置分页(page / pageSize / total) |
|
|
197
|
+
| `getSelectRowKeys()` / `getSelectRows()` | 获取选中行 keys 或数据 |
|
|
198
|
+
| `setSelectedRowKeys(keys)` | 设置选中行 keys(从全量数据中匹配) |
|
|
199
|
+
| `clearSelectedRowKeys()` | 清空选中行 |
|
|
200
|
+
| `deleteSelectRowByKey(key)` | 取消选中某个 key |
|
|
201
|
+
| `updateTableData(index, key, value)` | 按当前页索引更新单格数据(自动转换为全量索引) |
|
|
202
|
+
| `updateTableDataRecord(rowKey, record)` | 按 rowKey 更新整行(全量数据中查找) |
|
|
203
|
+
| `deleteTableDataRecord(rowKey)` | 按 rowKey 删除指定行(全量数据),自动同步 total |
|
|
204
|
+
| `insertTableDataRecord(record, index?)` | 插入一行数据(全量数据),自动同步 total |
|
|
205
|
+
| `getPaginationRef()` | 获取当前分页信息 |
|
|
206
|
+
| `getShowPagination()` / `setShowPagination(show)` | 获取/设置是否显示分页 |
|
|
207
|
+
| `getRowSelection()` | 获取当前行选择配置 |
|
|
208
|
+
| `expandAll()` / `collapseAll()` | 展开/折叠树形表格所有行 |
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 多级表头
|
|
213
|
+
|
|
214
|
+
通过 `columns.children` 嵌套配置子列,实现分组表头:
|
|
215
|
+
|
|
216
|
+
```vue
|
|
217
|
+
<script setup lang="ts">
|
|
218
|
+
import type { ProColumn } from 'element-component-pro'
|
|
219
|
+
|
|
220
|
+
const columns: ProColumn[] = [
|
|
221
|
+
{
|
|
222
|
+
title: '基本信息',
|
|
223
|
+
children: [
|
|
224
|
+
{ title: '姓名', dataIndex: 'name', width: 120, fixed: 'left' },
|
|
225
|
+
{ title: '年龄', dataIndex: 'age', width: 80, align: 'center' },
|
|
226
|
+
{ title: '性别', dataIndex: 'gender', width: 80, align: 'center' },
|
|
227
|
+
],
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
title: '联系方式',
|
|
231
|
+
children: [
|
|
232
|
+
{ title: '电话', dataIndex: 'phone', width: 150 },
|
|
233
|
+
{ title: '邮箱', dataIndex: 'email', minWidth: 200 },
|
|
234
|
+
],
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
title: '地址',
|
|
238
|
+
dataIndex: 'address',
|
|
239
|
+
minWidth: 200,
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
title: '状态',
|
|
243
|
+
dataIndex: 'status',
|
|
244
|
+
width: 100,
|
|
245
|
+
align: 'center',
|
|
246
|
+
valueEnum: { 1: { text: '在职' }, 0: { text: '离职' } },
|
|
247
|
+
},
|
|
248
|
+
]
|
|
249
|
+
</script>
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
子列支持所有 `ProColumn` 配置(`width`、`minWidth`、`align`、`sortable`、`valueEnum` 等),支持任意层级嵌套。
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## 合并单元格
|
|
257
|
+
|
|
258
|
+
通过 `spanMethod` 返回 `[rowspan, colspan]` 或 `{ rowspan, colspan }` 实现行/列合并,返回 `[0, 0]` 隐藏单元格:
|
|
259
|
+
|
|
260
|
+
```vue
|
|
261
|
+
<template>
|
|
262
|
+
<ProTable
|
|
263
|
+
title="合并示例"
|
|
264
|
+
:columns="columns"
|
|
265
|
+
:data-source="data"
|
|
266
|
+
:span-method="spanMethod"
|
|
267
|
+
:show-index-column="false"
|
|
268
|
+
/>
|
|
269
|
+
</template>
|
|
270
|
+
|
|
271
|
+
<script setup lang="ts">
|
|
272
|
+
import type { ProColumn } from 'element-component-pro'
|
|
273
|
+
|
|
274
|
+
const columns: ProColumn[] = [
|
|
275
|
+
{ title: '区域', dataIndex: 'region', width: 1 },
|
|
276
|
+
{ title: '姓名', dataIndex: 'name', width: 1 },
|
|
277
|
+
{ title: '销量', dataIndex: 'sales', width: 1 },
|
|
278
|
+
]
|
|
279
|
+
|
|
280
|
+
const data = [
|
|
281
|
+
{ id: 1, region: '华东', name: '张三', sales: 100 },
|
|
282
|
+
{ id: 2, region: '华东', name: '李四', sales: 80 },
|
|
283
|
+
{ id: 3, region: '华南', name: '王五', sales: 120 },
|
|
284
|
+
{ id: 4, region: '华南', name: '赵六', sales: 90 },
|
|
285
|
+
]
|
|
286
|
+
|
|
287
|
+
const spanMethod = ({ row, column, rowIndex, columnIndex }) => {
|
|
288
|
+
if (columnIndex === 0) {
|
|
289
|
+
if (rowIndex === 0) return [2, 1]
|
|
290
|
+
if (rowIndex === 1) return [0, 0] // 隐藏
|
|
291
|
+
if (rowIndex === 2) return [2, 1]
|
|
292
|
+
if (rowIndex === 3) return [0, 0] // 隐藏
|
|
293
|
+
}
|
|
294
|
+
return [1, 1]
|
|
295
|
+
}
|
|
296
|
+
</script>
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
`spanMethod` 回调参数(`column` 为原始 `ProColumn`):
|
|
300
|
+
|
|
301
|
+
| 参数 | 说明 |
|
|
302
|
+
|------|------|
|
|
303
|
+
| `row` | 当前行数据 |
|
|
304
|
+
| `column` | 原始 `ProColumn` 配置 |
|
|
305
|
+
| `rowIndex` | 行索引(从 0 开始) |
|
|
306
|
+
| `columnIndex` | 列索引(从 0 开始,含选择列/序号列) |
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## 跨分页选择
|
|
311
|
+
|
|
312
|
+
默认支持跨分页保留勾选(切换页码不清空)。如需切换页码时清空:
|
|
313
|
+
|
|
314
|
+
```vue
|
|
315
|
+
<ProTable
|
|
316
|
+
:columns="columns"
|
|
317
|
+
:api="fetchTableData"
|
|
318
|
+
row-key="id"
|
|
319
|
+
:row-selection="{ type: 'checkbox' }"
|
|
320
|
+
:clear-select-on-page-change="true"
|
|
321
|
+
/>
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
通过 `tableAction` 获取已选 keys:
|
|
325
|
+
|
|
326
|
+
```ts
|
|
327
|
+
const selectedKeys = tableAction.getSelectRowKeys()
|
|
328
|
+
const selectedRows = tableAction.getSelectRows()
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## 树形表格
|
|
334
|
+
|
|
335
|
+
通过 `treeProps` 配置树形数据,通过 `load` 实现懒加载:
|
|
336
|
+
|
|
337
|
+
```vue
|
|
338
|
+
<ProTable
|
|
339
|
+
:columns="columns"
|
|
340
|
+
:data-source="treeData"
|
|
341
|
+
row-key="id"
|
|
342
|
+
:tree-props="{ hasChildren: 'hasChildren', children: 'children' }"
|
|
343
|
+
:default-expand-all="true"
|
|
344
|
+
/>
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
懒加载模式:
|
|
348
|
+
|
|
349
|
+
```vue
|
|
350
|
+
<ProTable
|
|
351
|
+
:columns="columns"
|
|
352
|
+
:data-source="treeData"
|
|
353
|
+
row-key="id"
|
|
354
|
+
:tree-props="{ hasChildren: 'hasChildren' }"
|
|
355
|
+
:lazy="true"
|
|
356
|
+
:load="loadChildren"
|
|
357
|
+
/>
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
```ts
|
|
361
|
+
const loadChildren = (row, treeNode, resolve) => {
|
|
362
|
+
fetchChildren(row.id).then(res => resolve(res))
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## 操作列 + TableAction
|
|
369
|
+
|
|
370
|
+
`TableAction` 用于渲染右侧操作列:
|
|
371
|
+
|
|
372
|
+
```vue
|
|
373
|
+
<template #bodyCell="{ column, record }">
|
|
374
|
+
<template v-if="column.dataIndex === 'action'">
|
|
375
|
+
<TableAction
|
|
376
|
+
:actions="[
|
|
377
|
+
{ label: '编辑', onClick: () => handleEdit(record) },
|
|
378
|
+
{ label: '查看', type: 'text', onClick: () => handleView(record) },
|
|
379
|
+
]"
|
|
380
|
+
:drop-down-actions="[
|
|
381
|
+
{
|
|
382
|
+
label: '删除',
|
|
383
|
+
color: 'error',
|
|
384
|
+
popConfirm: {
|
|
385
|
+
title: '确认删除?',
|
|
386
|
+
confirm: () => handleDelete(record),
|
|
387
|
+
},
|
|
388
|
+
},
|
|
389
|
+
]"
|
|
390
|
+
/>
|
|
391
|
+
</template>
|
|
392
|
+
</template>
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
`TableActionItem` 支持字段:
|
|
396
|
+
|
|
397
|
+
| 字段 | 类型 | 说明 |
|
|
398
|
+
|------|------|------|
|
|
399
|
+
| `label` | `string` | 按钮文本 |
|
|
400
|
+
| `icon` | `string` | 图标 class |
|
|
401
|
+
| `color` | `'success' \| 'error' \| 'warning'` | 颜色,内部映射到按钮类型 |
|
|
402
|
+
| `type` | `string` | Element UI 按钮 type |
|
|
403
|
+
| `disabled` | `boolean` | 是否禁用 |
|
|
404
|
+
| `divider` | `boolean` | 是否显示垂直分隔线 |
|
|
405
|
+
| `ifShow` | `boolean \| (action) => boolean` | 是否显示 |
|
|
406
|
+
| `tooltip` | `string \| TooltipProps` | Tooltip 配置 |
|
|
407
|
+
| `popConfirm` | `{ title, okText?, confirm, cancel? }` | 气泡确认 |
|
|
408
|
+
| `onClick` | `(e: MouseEvent) => void` | 点击回调 |
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
## Slots
|
|
413
|
+
|
|
414
|
+
| 名称 | 说明 |
|
|
415
|
+
|------|------|
|
|
416
|
+
| `tableTitle` | 标题左侧区域 |
|
|
417
|
+
| `toolbar` | 工具栏区域 |
|
|
418
|
+
| `bodyCell` | 单元格渲染插槽:`{ column, record, index, value }`;返回空内容时自动回退到默认渲染 |
|
|
419
|
+
| `[dataIndex]` | 以 `dataIndex` 命名的单元格插槽,优先级高于 `bodyCell` |
|
|
420
|
+
|
|
421
|
+
> **bodyCell 回退行为**:如果 slot 返回 `null/undefined/false`,ProTable 会自动使用默认渲染逻辑,因此只需在 `v-if` 分支里处理特定列。
|
|
422
|
+
|
|
423
|
+
---
|
|
424
|
+
|
|
425
|
+
## Events
|
|
426
|
+
|
|
427
|
+
| 事件名 | 参数 | 说明 |
|
|
428
|
+
|--------|------|------|
|
|
429
|
+
| `fetch-success` | `{ items, total }` | 接口请求成功 |
|
|
430
|
+
| `fetch-error` | `error` | 接口请求失败 |
|
|
431
|
+
| `selection-change` | `{ keys, rows }` | 勾选变化 |
|
|
432
|
+
| `row-click` | `(record, event)` | 行点击 |
|
|
433
|
+
| `row-dblclick` | `(record, event)` | 行双击 |
|
|
434
|
+
| `sort-change` | `{ prop, order }` | 排序变化 |
|
|
435
|
+
| `expand-change` | `(row, expanded)` | 展开行变化(树形表格) |
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## ProTable Props
|
|
440
|
+
|
|
441
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
442
|
+
|------|------|--------|------|
|
|
443
|
+
| `columns` | `ProColumn[]` | - | 列配置 |
|
|
444
|
+
| `dataSource` | `Record<string, unknown>[]` | - | 本地数据源 |
|
|
445
|
+
| `api` | `(params) => Promise<{ list, total }>` | - | 请求函数 |
|
|
446
|
+
| `rowKey` | `string` | `'id'` | 行主键字段 |
|
|
447
|
+
| `title` | `string` | - | 表格标题 |
|
|
448
|
+
| `titleHelpMessage` | `string \| string[]` | - | 标题右侧帮助文案 |
|
|
449
|
+
| `bordered` | `boolean` | `false` | 是否显示边框 |
|
|
450
|
+
| `striped` | `boolean` | `true` | 是否显示斑马纹 |
|
|
451
|
+
| `size` | `'medium' \| 'small' \| 'large'` | `'medium'` | 表格尺寸 |
|
|
452
|
+
| `loading` | `boolean` | `false` | 手动控制 loading |
|
|
453
|
+
| `maxHeight` | `number \| string` | - | 表格最大高度 |
|
|
454
|
+
| `height` | `number \| string` | - | 表格高度 |
|
|
455
|
+
| `ellipsis` | `boolean` | `true` | 文本超出时省略并显示 tooltip |
|
|
456
|
+
| `showIndexColumn` | `boolean` | `true` | 是否显示序号列 |
|
|
457
|
+
| `indexColumnProps` | `Partial<ProColumn>` | - | 序号列配置 |
|
|
458
|
+
| `actionColumn` | `Partial<ProColumn>` | - | 操作列配置 |
|
|
459
|
+
| `rowSelection` | `{ type?, width?, fixed?, getCheckboxProps?, getRadioProps? }` | - | 选择列配置 |
|
|
460
|
+
| `clearSelectOnPageChange` | `boolean` | `false` | 切换页码时清空勾选 |
|
|
461
|
+
| `pagination` | `false \| object` | `{ pageSize: 10 }` | 分页配置,`false` 不显示 |
|
|
462
|
+
| `fetchSetting` | `FetchSetting` | 见下方 | 接口字段映射 |
|
|
463
|
+
| `beforeFetch` | `(params) => params` | - | 请求前处理参数 |
|
|
464
|
+
| `afterFetch` | `(data) => data` | - | 请求后处理返回值 |
|
|
465
|
+
| `immediate` | `boolean` | `true` | 挂载后自动请求(有 api 时) |
|
|
466
|
+
| `searchInfo` | `Record<string, unknown>` | - | 额外请求参数 |
|
|
467
|
+
| `spanMethod` | `(params) => [rs, cs] \| { rowspan, colspan }` | - | 合并单元格 |
|
|
468
|
+
| `treeProps` | `TreeProps` | - | 树形表格配置 |
|
|
469
|
+
| `defaultExpandAll` | `boolean` | `false` | 默认展开所有树节点 |
|
|
470
|
+
| `expandRowKeys` | `(string \| number)[]` | - | 默认展开的行 |
|
|
471
|
+
| `lazy` | `boolean` | `false` | 是否懒加载子节点 |
|
|
472
|
+
| `load` | `(row, treeNode, resolve) => void` | - | 懒加载函数 |
|
|
473
|
+
|
|
474
|
+
`fetchSetting` 默认值:
|
|
475
|
+
|
|
476
|
+
```ts
|
|
477
|
+
{
|
|
478
|
+
pageField: 'page',
|
|
479
|
+
sizeField: 'pageSize',
|
|
480
|
+
listField: 'list',
|
|
481
|
+
totalField: 'total',
|
|
482
|
+
}
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
---
|
|
486
|
+
|
|
487
|
+
## ProColumn
|
|
488
|
+
|
|
489
|
+
| 字段 | 类型 | 说明 |
|
|
490
|
+
|------|------|------|
|
|
491
|
+
| `title` | `string` | 列标题 |
|
|
492
|
+
| `dataIndex` | `string` | 对应数据字段名 |
|
|
493
|
+
| `key` | `string` | 列唯一标识 |
|
|
494
|
+
| `width` | `number \| string` | 列宽:`number` 为比例,`string` 为 px |
|
|
495
|
+
| `minWidth` | `number \| string` | 最小宽度 |
|
|
496
|
+
| `maxWidth` | `number \| string` | 最大宽度 |
|
|
497
|
+
| `fixed` | `'left' \| 'right'` | 固定列 |
|
|
498
|
+
| `sortable` | `boolean` | 是否可排序 |
|
|
499
|
+
| `align` | `'left' \| 'center' \| 'right'` | 对齐方式 |
|
|
500
|
+
| `resizable` | `boolean` | 是否可调整宽度 |
|
|
501
|
+
| `ellipsis` | `boolean` | 是否启用省略,默认继承表格级 |
|
|
502
|
+
| `hideInTable` | `boolean` | 是否在表格中隐藏 |
|
|
503
|
+
| `defaultHidden` | `boolean` | 默认隐藏,可通过列设置显示 |
|
|
504
|
+
| `helpMessage` | `string \| string[]` | 列头右侧帮助文案 |
|
|
505
|
+
| `valueType` | `string` | 值类型(text / date / dateTime / option / select / index) |
|
|
506
|
+
| `valueEnum` | `Record` | 枚举值映射 |
|
|
507
|
+
| `customRender` | `({ text, record, index }) => VNode \| string` | 自定义渲染 |
|
|
508
|
+
| `formatter` | `(row, column, cellValue) => string` | Element UI formatter |
|
|
509
|
+
| `ifShow` | `boolean \| ({ column }) => boolean` | 是否显示当前列 |
|
|
510
|
+
| `children` | `ProColumn[]` | 子列配置(多级表头) |
|
|
511
|
+
|
|
512
|
+
---
|
|
513
|
+
|
|
514
|
+
## 组件默认配置(useComponentSetting)
|
|
515
|
+
|
|
516
|
+
通过 `useComponentSetting` 统一设置组件默认 props:
|
|
517
|
+
|
|
518
|
+
```ts
|
|
519
|
+
import { useComponentSetting } from 'element-component-pro'
|
|
520
|
+
|
|
521
|
+
const { getSetting, setSetting } = useComponentSetting()
|
|
522
|
+
|
|
523
|
+
setSetting('ProTable', { size: 'small', bordered: true })
|
|
524
|
+
setSetting('ProForm', { labelWidth: '140px', size: 'small' })
|
|
525
|
+
|
|
526
|
+
const tableDefaults = getSetting('ProTable') // 获取 ProTable 默认配置
|
|
527
|
+
const all = getSetting() // 获取全部配置
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
详见 [ComponentSetting.md](./ComponentSetting.md)。
|
|
531
|
+
|
|
532
|
+
---
|
|
533
|
+
|
|
534
|
+
## 示例
|
|
535
|
+
|
|
536
|
+
```bash
|
|
537
|
+
npm install
|
|
538
|
+
npm run dev
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
访问 `/?tab=basic` 等路由参数切换示例:
|
|
542
|
+
|
|
543
|
+
| 参数 | 说明 |
|
|
544
|
+
|------|------|
|
|
545
|
+
| `?tab=basic` | 基础表格 |
|
|
546
|
+
| `?tab=tableForm` | ProTable + ProForm 对比表 |
|
|
547
|
+
| `?tab=tableFormCombo` | ProTable + ProForm 同页组合 |
|
|
548
|
+
| `?tab=remote` | 远程数据加载 |
|
|
549
|
+
| `?tab=custom` | 自定义渲染 |
|
|
550
|
+
| `?tab=action` | 带操作列 |
|
|
551
|
+
| `?tab=useProTable` | useProTable 编程控制 |
|
|
552
|
+
| `?tab=span` | 合并单元格 |
|
|
553
|
+
| `?tab=tree` | 树形表格 |
|
|
554
|
+
| `?tab=crossPage` | 跨分页选择 |
|
|
555
|
+
| `?tab=groupHeader` | 多级表头 |
|
|
556
|
+
| `?tab=componentSetting` | 组件默认配置 |
|