el-plus 0.0.84 → 0.0.86-beta.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.
Files changed (87) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/index.full.js +7 -3
  3. package/dist/index.full.min.js +2 -2
  4. package/dist/index.full.min.js.map +1 -1
  5. package/dist/index.full.min.mjs +2 -2
  6. package/dist/index.full.min.mjs.map +1 -1
  7. package/dist/index.full.mjs +7 -3
  8. package/docs/api-examples.md +49 -0
  9. package/docs/components/attachment.md +111 -0
  10. package/docs/components/buttons.md +108 -0
  11. package/docs/components/custom-column.md +70 -0
  12. package/docs/components/date-picker-range.md +61 -0
  13. package/docs/components/dialog.md +104 -0
  14. package/docs/components/footer-info.md +101 -0
  15. package/docs/components/form.md +186 -0
  16. package/docs/components/header.md +89 -0
  17. package/docs/components/index.md +23 -0
  18. package/docs/components/input.md +109 -0
  19. package/docs/components/link.md +63 -0
  20. package/docs/components/search-list-page.md +81 -0
  21. package/docs/components/select.md +163 -0
  22. package/docs/components/table.md +133 -0
  23. package/docs/components/title.md +70 -0
  24. package/docs/components/use-choose-dialog.md +115 -0
  25. package/docs/components/use-confirm-dialog.md +87 -0
  26. package/docs/components/use-form-dialog.md +87 -0
  27. package/docs/guide/markdown-examples.md +85 -0
  28. package/docs/index.md +25 -0
  29. package/docs/pages/detail.md +74 -0
  30. package/docs/pages/list.md +73 -0
  31. package/es/cli/src/commands/gen-docs.d.ts +2 -0
  32. package/es/cli/src/commands/install.d.ts +13 -0
  33. package/es/cli/src/commands/parse.d.ts +2 -0
  34. package/es/cli/src/index.d.ts +2 -0
  35. package/es/cli/src/parser/image-parser.d.ts +8 -0
  36. package/es/cli/src/parser/modao.d.ts +54 -0
  37. package/es/components/buttons/index.d.ts +45 -45
  38. package/es/components/buttons/src/buttons-vue.d.ts +16 -16
  39. package/es/components/buttons/src/buttons.d.ts +1 -1
  40. package/es/components/date-picker-range/index.d.ts +3 -3
  41. package/es/components/date-picker-range/src/date-picker-range.vue.d.ts +1 -1
  42. package/es/components/footer-info/index.d.ts +3 -3
  43. package/es/components/footer-info/src/footer-info.vue.d.ts +1 -1
  44. package/es/components/form/src/form-item-vue.mjs +6 -2
  45. package/es/components/form/src/form-item-vue.mjs.map +1 -1
  46. package/es/components/header/index.d.ts +3 -3
  47. package/es/components/header/src/header.d.ts +1 -1
  48. package/es/components/header/src/header.mjs.map +1 -1
  49. package/es/components/header/src/header.vue.d.ts +1 -1
  50. package/es/components/input/index.d.ts +3 -3
  51. package/es/components/input/src/input.vue.d.ts +1 -1
  52. package/es/components/link/index.d.ts +6 -6
  53. package/es/components/link/src/link.d.ts +1 -1
  54. package/es/components/link/src/link.vue.d.ts +3 -3
  55. package/es/components/search-list-page/index.d.ts +12 -12
  56. package/es/components/search-list-page/src/search-list-page.vue.d.ts +4 -4
  57. package/es/components/search-list-page/src/use-search-list-page.d.ts +4 -4
  58. package/es/package.json.mjs +1 -1
  59. package/lib/cli/src/commands/gen-docs.d.ts +2 -0
  60. package/lib/cli/src/commands/install.d.ts +13 -0
  61. package/lib/cli/src/commands/parse.d.ts +2 -0
  62. package/lib/cli/src/index.d.ts +2 -0
  63. package/lib/cli/src/parser/image-parser.d.ts +8 -0
  64. package/lib/cli/src/parser/modao.d.ts +54 -0
  65. package/lib/components/buttons/index.d.ts +45 -45
  66. package/lib/components/buttons/src/buttons-vue.d.ts +16 -16
  67. package/lib/components/buttons/src/buttons.d.ts +1 -1
  68. package/lib/components/date-picker-range/index.d.ts +3 -3
  69. package/lib/components/date-picker-range/src/date-picker-range.vue.d.ts +1 -1
  70. package/lib/components/footer-info/index.d.ts +3 -3
  71. package/lib/components/footer-info/src/footer-info.vue.d.ts +1 -1
  72. package/lib/components/form/src/form-item-vue.js +5 -1
  73. package/lib/components/form/src/form-item-vue.js.map +1 -1
  74. package/lib/components/header/index.d.ts +3 -3
  75. package/lib/components/header/src/header.d.ts +1 -1
  76. package/lib/components/header/src/header.js.map +1 -1
  77. package/lib/components/header/src/header.vue.d.ts +1 -1
  78. package/lib/components/input/index.d.ts +3 -3
  79. package/lib/components/input/src/input.vue.d.ts +1 -1
  80. package/lib/components/link/index.d.ts +6 -6
  81. package/lib/components/link/src/link.d.ts +1 -1
  82. package/lib/components/link/src/link.vue.d.ts +3 -3
  83. package/lib/components/search-list-page/index.d.ts +12 -12
  84. package/lib/components/search-list-page/src/search-list-page.vue.d.ts +4 -4
  85. package/lib/components/search-list-page/src/use-search-list-page.d.ts +4 -4
  86. package/lib/package.json.js +1 -1
  87. package/package.json +2 -1
@@ -0,0 +1,163 @@
1
+ # EpSelect 下拉选择
2
+
3
+ 基于 el-select 封装,支持接口获取选项、自定义 label 等功能。
4
+
5
+ ## 基本用法
6
+
7
+ ```vue
8
+ <template>
9
+ <EpSelect v-model="value" :options="options" />
10
+ </template>
11
+
12
+ <script setup>
13
+ import { ref } from 'vue'
14
+
15
+ const value = ref('')
16
+ const options = [
17
+ { label: '选项1', value: '1' },
18
+ { label: '选项2', value: '2' },
19
+ ]
20
+ </script>
21
+ ```
22
+
23
+ ## Props
24
+
25
+ | 属性 | 说明 | 类型 | 默认值 |
26
+ |------|------|------|--------|
27
+ | v-model | 绑定值 ^el^ | `string \| number \| array` | - |
28
+ | options | 选项列表 ^el^ | `array` | `[]` |
29
+ | api | 选项接口地址 | `string \| (reqData) => Promise` | - |
30
+ | method | 请求方法 | `string` | `'post'` |
31
+ | reqData | 请求体数据 | `object` | `{}` |
32
+ | reqParams | URL 参数 | `object` | `{}` |
33
+ | reqBefore | 请求前处理 | `(reqData) => reqData` | - |
34
+ | reqAfter | 响应后处理 | `(res) => options` | - |
35
+ | labelKey | label 字段名 | `string` | `'label'` |
36
+ | valueKey | value 字段名 | `string` | `'value'` |
37
+ | formatLabel | 自定义 label 格式化 | `(item) => string` | - |
38
+ | disabledOption | 禁用选项判断 | `(item) => boolean` | - |
39
+ | lazy | 延迟加载(api模式) | `boolean` | `false` |
40
+ | codeInLabel | 下拉label 中显示 code ,当为boolean默认是valueKey| `boolean \| string` | - |
41
+ | clearable | 是否可清空 ^el^ | `boolean` | `true` |
42
+
43
+ > ^el^ 表示继承自 [el-select](https://element-plus.org/zh-CN/component/select.html#select-attributes) 的属性
44
+
45
+ ## 在 Form 中使用
46
+
47
+ ```tsx
48
+ const formItemList = [
49
+ {
50
+ prop: 'status',
51
+ label: '状态',
52
+ type: 'EpSelect',
53
+ props: {
54
+ options: [
55
+ { label: '启用', value: 1 },
56
+ { label: '禁用', value: 0 },
57
+ ],
58
+ },
59
+ },
60
+ ]
61
+ ```
62
+
63
+ ## 接口获取选项
64
+
65
+ ```tsx
66
+ {
67
+ prop: 'companyCode',
68
+ label: '公司',
69
+ type: 'EpSelect',
70
+ props: {
71
+ api: '/api/company/list',
72
+ valueKey: 'code',
73
+ labelKey: 'name',
74
+ },
75
+ }
76
+ ```
77
+
78
+ ## 远程搜索
79
+ ```tsx
80
+ {
81
+ prop: 'companyCode',
82
+ label: '公司',
83
+ type: 'EpSelect',
84
+ props: {
85
+ api: '/api/company/list',
86
+ valueKey: 'code',
87
+ labelKey: 'name',
88
+ remote: true,
89
+ filterable: true,
90
+ },
91
+ }
92
+
93
+ ```
94
+
95
+ ## 带描述
96
+ - 适用于有code,但配置为remote/lazy,导致没有name的情况
97
+ ```tsx
98
+ {
99
+ prop: 'companyCode',
100
+ label: '公司',
101
+ type: 'EpSelect',
102
+ props: {
103
+ api: '/api/company/list',
104
+ valueKey: 'code',
105
+ labelKey: 'name',
106
+ lazy: true,
107
+ desc: '描述信息'
108
+ },
109
+ }
110
+ ```
111
+
112
+ ## 自定义 label 格式
113
+
114
+ ```tsx
115
+ {
116
+ prop: 'companyCode',
117
+ label: '公司',
118
+ type: 'EpSelect',
119
+ props: {
120
+ api: '/api/company/list',
121
+ valueKey: 'code',
122
+ labelKey: 'name',
123
+ formatLabel: (item) => `${item.name} (${item.code})`,
124
+ },
125
+ }
126
+ ```
127
+
128
+ ## 监听变化
129
+
130
+ ```tsx
131
+ {
132
+ prop: 'companyCode',
133
+ label: '公司',
134
+ type: 'EpSelect',
135
+ props: {
136
+ options: [],
137
+ },
138
+ onChange: (value, item) => {
139
+ // value: 选中的值
140
+ // item: 选中的选项对象
141
+ formData.companyName = item?.name
142
+ },
143
+ }
144
+ ```
145
+
146
+ ## codeInLabel 模式
147
+
148
+ 下拉同时显示 code 和 label:
149
+
150
+ ```tsx
151
+ {
152
+ prop: 'itemCode',
153
+ label: '商品',
154
+ type: 'EpSelect',
155
+ props: {
156
+ api: '/api/item/list',
157
+ valueKey: 'code',
158
+ labelKey: 'name',
159
+ codeInLabel: true, // 显示为 "name code"
160
+ // codeInLabel: 'itemCode', // 显示为 "name itemCode字段值"
161
+ },
162
+ }
163
+ ```
@@ -0,0 +1,133 @@
1
+ # EpTable 数据表格
2
+
3
+ 基于 el-table 封装,支持配置化列、分页、操作列等功能。
4
+
5
+ ## 基本用法
6
+
7
+ ```vue
8
+ <template>
9
+ <EpTable
10
+ :data="tableData"
11
+ :columns="columns"
12
+ :action-buttons="actionButtons"
13
+ />
14
+ </template>
15
+
16
+ <script setup lang="tsx">
17
+ import { ref } from 'vue'
18
+
19
+ const tableData = ref([])
20
+
21
+ const columns = [
22
+ { prop: 'name', label: '名称' },
23
+ { prop: 'status', label: '状态' },
24
+ ]
25
+
26
+ const actionButtons = [
27
+ { name: '编辑', onClick: (row) => {} },
28
+ { name: '删除', onClick: (row) => {} },
29
+ ]
30
+ </script>
31
+ ```
32
+
33
+ ## Props
34
+
35
+ | 属性 | 说明 | 类型 | 默认值 |
36
+ |------|------|------|--------|
37
+ | data | 表格数据 ^el^ | `array` | `[]` |
38
+ | columns | 列配置 | [`TableColumn[]`](#tablecolumn-配置) | `[]` |
39
+ | api | 数据接口 | `string \| (reqData) => Promise` | - |
40
+ | method | 请求方法 | `string` | `'post'` |
41
+ | reqData | 请求体数据 | `object` | `{}` |
42
+ | reqParams | URL 参数 | `object` | `{}` |
43
+ | reqBefore | 请求前处理 | `(reqData) => reqData` | - |
44
+ | reqAfter | 响应后处理 | `(res) => data` | - |
45
+ | size | 表格尺寸 ^el^ | `'large' \| 'default' \| 'small'` | `'default'` |
46
+ | border | 是否带边框 ^el^ | `boolean` | `true` |
47
+ | headerCellStyle | 表头样式 ^el^ | `object` | `{ background: '#EEEFF3', fontSize: '14px', color: '#505050' }` |
48
+ | showSelectionCol | 显示多选列 | `boolean` | `false` |
49
+ | showSingleSelectionCol | 显示单选列 | `boolean` | `false` |
50
+ | showIndexCol | 显示序号列 | `boolean` | `true` |
51
+ | align | 对齐方式 | `'left' \| 'center' \| 'right'` | `'center'` |
52
+ | minWidth | 列最小宽度 | `number \| string` | - |
53
+ | actionColWidth | 操作列宽度 | `number \| string` | `200` |
54
+ | actionButtons | 操作列按钮 | [`ButtonProps[]`](./buttons.md#buttonprops-配置) | `[]` |
55
+ | formatColumns | 格式化列配置 | [`TableColumn[]`](#tablecolumn-配置) | `[]` |
56
+ | showPagination | 显示分页 | `boolean` | `false` |
57
+ | paginationProps | 分页属性 | `object` | `{}` |
58
+ | isFrontPage | 前端分页 | `boolean` | `false` |
59
+ | isInitSearch | 初始化加载 | `boolean` | `true` |
60
+ | disabled | 是否禁用 | `boolean` | `false` |
61
+ | reserveSelection | 保留选择 | `boolean` | `false` |
62
+ | selectable | 可选择函数 | `(row, index) => boolean` | - |
63
+ | indexFormatter | 序号列格式化 | `number \| Function` | - |
64
+
65
+ > ^el^ 表示继承自 [el-table](https://element-plus.org/zh-CN/component/table.html) 的属性
66
+
67
+ ## TableColumn 配置
68
+
69
+ | 属性 | 说明 | 类型 |
70
+ |------|------|------|
71
+ | prop | 字段名 | `string` |
72
+ | label | 列标题 | `string` |
73
+ | width | 列宽度 | `number \| string` |
74
+ | minWidth | 最小宽度 | `number \| string` |
75
+ | type | 组件类型 | `string` |
76
+ | props | 组件属性 | `object` |
77
+ | render | 自定义渲染 | `({ row, $index }) => VNode` |
78
+ | headerRender | 自定义表头渲染 | `() => VNode` |
79
+ | required | 是否必填 | `boolean \| () => boolean` |
80
+ | disabled | 是否禁用 | `boolean \| (scope) => boolean` |
81
+ | visible | 是否显示 | `boolean \| () => boolean` |
82
+ | filter | 显示筛选 | `boolean` |
83
+ | editable | 可批量编辑 | `boolean` |
84
+
85
+ ## 在 Form 中使用
86
+
87
+ ```tsx
88
+ const formItemList = [
89
+ {
90
+ col: 24,
91
+ type: 'EpTable',
92
+ props: {
93
+ ref: 'detailTable',
94
+ data: formData.detailList,
95
+ showSelectionCol: true,
96
+ columns: [
97
+ { prop: 'itemCode', label: '编号' },
98
+ { prop: 'itemName', label: '名称' },
99
+ {
100
+ prop: 'quantity',
101
+ label: '数量',
102
+ type: 'EpInput',
103
+ props: { radix: 0 },
104
+ },
105
+ ],
106
+ },
107
+ },
108
+ ]
109
+ ```
110
+
111
+ ## 自定义渲染
112
+
113
+ ```tsx
114
+ const columns = [
115
+ {
116
+ prop: 'status',
117
+ label: '状态',
118
+ render: ({ row }) => (
119
+ <el-tag type={row.status === 1 ? 'success' : 'danger'}>
120
+ {row.status === 1 ? '启用' : '禁用'}
121
+ </el-tag>
122
+ ),
123
+ },
124
+ ]
125
+ ```
126
+
127
+ ## Expose 方法
128
+
129
+ | 方法 | 说明 |
130
+ |------|------|
131
+ | getSelectionRows | 获取选中行 |
132
+ | clearSelection | 清空选择 |
133
+ | search | 重新加载数据 |
@@ -0,0 +1,70 @@
1
+ # EpTitle 标题分组
2
+
3
+ 用于表单分组的标题组件,支持右侧按钮和展开折叠。
4
+
5
+ ## 基本用法
6
+
7
+ ```vue
8
+ <template>
9
+ <EpTitle title="基本信息" />
10
+ </template>
11
+ ```
12
+
13
+ ## Props
14
+
15
+ | 属性 | 说明 | 类型 | 默认值 |
16
+ |------|------|------|--------|
17
+ | title | 标题文本 | `string` | - |
18
+ | buttons | 右侧按钮列表 | [`ButtonProps[]`](./buttons.md#buttonprops-配置) | `[]` |
19
+ | showDownUp | 显示展开折叠 | `boolean` | `false` |
20
+
21
+ ## Events
22
+
23
+ | 事件名 | 说明 | 回调参数 |
24
+ |--------|------|----------|
25
+ | toggle | 折叠状态切换 | `(expanded: boolean)` |
26
+
27
+ ## 带按钮
28
+
29
+ ```vue
30
+ <template>
31
+ <EpTitle title="商品明细" :buttons="buttons" />
32
+ </template>
33
+
34
+ <script setup>
35
+ const buttons = [
36
+ {
37
+ name: '新增',
38
+ type: 'primary',
39
+ onClick: () => {},
40
+ },
41
+ {
42
+ name: '删除',
43
+ type: 'danger',
44
+ plain: true,
45
+ onClick: () => {},
46
+ },
47
+ ]
48
+ </script>
49
+ ```
50
+
51
+ ## 在 Form 中使用
52
+
53
+ ```tsx
54
+ const formItemList = [
55
+ {
56
+ col: 24,
57
+ type: 'EpTitle',
58
+ props: {
59
+ title: '基本信息',
60
+ buttons: [
61
+ {
62
+ name: '操作',
63
+ onClick: () => {},
64
+ },
65
+ ],
66
+ },
67
+ },
68
+ // 其他表单项...
69
+ ]
70
+ ```
@@ -0,0 +1,115 @@
1
+ # useChooseDialog 选择对话框
2
+
3
+ 基于 useDialog 实现的选择对话框,集成 EpSearchListPage 组件,支持单选和多选。
4
+
5
+ ## 基本用法
6
+
7
+ ```vue
8
+ <template>
9
+ <el-button @click="handleChoose">选择用户</el-button>
10
+ <ChooseDialog />
11
+ </template>
12
+
13
+ <script setup lang="tsx">
14
+ import { useChooseDialog } from 'el-plus'
15
+
16
+ const ChooseDialog = useChooseDialog({
17
+ title: '选择用户',
18
+ multiple: false, // 单选模式
19
+ dialogProps: {
20
+ destroyOnClose: true, // 关闭时销毁对话框内容
21
+ },
22
+ formItemList: [
23
+ { prop: 'name', label: '姓名' },
24
+ ],
25
+ columns: [
26
+ { prop: 'name', label: '姓名' },
27
+ { prop: 'dept', label: '部门' },
28
+ ],
29
+ api: getUserList, // 列表接口
30
+ })
31
+
32
+ const handleChoose = async () => {
33
+ try {
34
+ const selection = await ChooseDialog.start()
35
+ console.log('选中', selection)
36
+ } catch (e) {
37
+ console.log('取消')
38
+ }
39
+ }
40
+ </script>
41
+ ```
42
+
43
+ ## Options
44
+
45
+ | 属性 | 说明 | 类型 | 默认值 |
46
+ |------|------|------|--------|
47
+ | title | 对话框标题 | `string` | - |
48
+ | dialogProps | 对话框属性,继承自 useDialog | `DialogOptions` | - |
49
+ | multiple | 是否多选 | `boolean` | `false` |
50
+ | formItemList | 搜索表单项配置,参考 [EpForm](./form.md) | `FormItemProps[]` | - |
51
+ | columns | 表格列配置,参考 [EpTable](./table.md) | `TableColumn[]` | - |
52
+ | api | 列表数据接口 | `(params) => Promise` | - |
53
+ | formData | 搜索表单数据 | `object` | - |
54
+ | formProps | 表单属性,参考 [EpForm](./form.md) | `FormProps` | `{ col: 3 }` |
55
+ | tableProps | 表格属性,参考 [EpTable](./table.md) | `TableProps` | `{ height: 300 }` |
56
+
57
+ ## 多选模式
58
+
59
+ ```tsx
60
+ const ChooseDialog = useChooseDialog({
61
+ title: '选择用户',
62
+ multiple: true, // 多选模式
63
+ formItemList: [
64
+ { prop: 'name', label: '姓名' },
65
+ ],
66
+ columns: [
67
+ { prop: 'name', label: '姓名' },
68
+ { prop: 'dept', label: '部门' },
69
+ ],
70
+ api: getUserList,
71
+ })
72
+ ```
73
+
74
+ 多选模式下,底部会显示已选数量,确认后返回选中的行数据数组。
75
+
76
+ ## 单选模式
77
+
78
+ ```tsx
79
+ const ChooseDialog = useChooseDialog({
80
+ title: '选择用户',
81
+ multiple: false, // 单选模式(默认)
82
+ columns: [
83
+ { prop: 'name', label: '姓名' },
84
+ ],
85
+ api: getUserList,
86
+ })
87
+ ```
88
+
89
+ 单选模式下,点击行即可选中并关闭对话框,返回选中的行数据对象。
90
+
91
+ ## 自定义表格高度
92
+
93
+ ```tsx
94
+ const ChooseDialog = useChooseDialog({
95
+ title: '选择用户',
96
+ tableProps: {
97
+ height: 500, // 自定义表格高度
98
+ },
99
+ columns: [...],
100
+ api: getUserList,
101
+ })
102
+ ```
103
+
104
+ ## 返回值
105
+
106
+ - **单选模式**: 返回选中的行数据对象
107
+ - **多选模式**: 返回选中的行数据数组
108
+
109
+ ## 方法
110
+
111
+ | 方法 | 说明 | 类型 |
112
+ |------|------|------|
113
+ | start | 打开对话框并返回 Promise | `() => Promise<Selection>` |
114
+ | open | 打开对话框 | `() => void` |
115
+ | close | 关闭对话框 | `() => void` |
@@ -0,0 +1,87 @@
1
+ # useConfirmDialog 确认对话框
2
+
3
+ 基于 useFormDialog 实现的确认对话框,内置 textarea 输入框,适用于审批意见、备注填写等场景。
4
+
5
+ ## 基本用法
6
+
7
+ ```vue
8
+ <template>
9
+ <el-button @click="handleConfirm">审批</el-button>
10
+ <ConfirmDialog />
11
+ </template>
12
+
13
+ <script setup lang="tsx">
14
+ import { useConfirmDialog } from 'el-plus'
15
+
16
+ const ConfirmDialog = useConfirmDialog({
17
+ title: '审批确认',
18
+ placeholder: '请输入审批意见',
19
+ })
20
+
21
+ const handleConfirm = async () => {
22
+ try {
23
+ const result = await ConfirmDialog.start()
24
+ console.log '确认,意见:', result.value)
25
+ } catch (e) {
26
+ console.log('取消')
27
+ }
28
+ }
29
+ </script>
30
+ ```
31
+
32
+ ## Options
33
+
34
+ | 属性 | 说明 | 类型 | 默认值 |
35
+ |------|------|------|--------|
36
+ | title | 对话框标题 | `string` | - |
37
+ | width | 对话框宽度 | `string` | `'50%'` |
38
+ | dialogProps | 对话框属性,继承自 useDialog | `DialogOptions` | - |
39
+ | rows | textarea 行数 | `number` | `5` |
40
+ | maxlength | 最大输入长度 | `number` | `500` |
41
+ | minlength | 最小输入长度 | `number` | - |
42
+ | showWordLimit | 显示字数统计 | `boolean` | `true` |
43
+ | placeholder | 输入框占位符 | `string` | - |
44
+ | rules | 表单验证规则 | `FormItemProps['rules']` | - |
45
+ | required | 是否必填 | `boolean` | `true` |
46
+
47
+ ## 自定义验证
48
+
49
+ ```tsx
50
+ const ConfirmDialog = useConfirmDialog({
51
+ title: '驳回原因',
52
+ required: true,
53
+ rules: [
54
+ { required: true, message: '请输入驳回原因', trigger: 'blur' },
55
+ { min: 10, message: '驳回原因不能少于10个字', trigger: 'blur' },
56
+ ],
57
+ placeholder: '请输入驳回原因(不少于10个字)',
58
+ })
59
+ ```
60
+
61
+ ## 非必填确认
62
+
63
+ ```tsx
64
+ const ConfirmDialog = useConfirmDialog({
65
+ title: '备注',
66
+ required: false, // 非必填
67
+ placeholder: '请输入备注(选填)',
68
+ })
69
+ ```
70
+
71
+ ## 返回值
72
+
73
+ 确认时返回表单数据对象:
74
+
75
+ ```ts
76
+ {
77
+ value: string // textarea 输入的内容
78
+ }
79
+ ```
80
+
81
+ ## 方法
82
+
83
+ | 方法 | 说明 | 类型 |
84
+ |------|------|------|
85
+ | start | 打开对话框并返回 Promise | `() => Promise<{ value: string }>` |
86
+ | open | 打开对话框 | `() => void` |
87
+ | close | 关闭对话框 | `() => void` |
@@ -0,0 +1,87 @@
1
+ # useFormDialog 表单对话框
2
+
3
+ 基于 useDialog 实现的表单对话框,集成 EpForm 组件,支持表单验证。
4
+
5
+ ## 基本用法
6
+
7
+ ```vue
8
+ <template>
9
+ <el-button @click="openDialog">打开表单对话框</el-button>
10
+ <FormDialog />
11
+ </template>
12
+
13
+ <script setup lang="tsx">
14
+ import { useFormDialog } from 'el-plus'
15
+
16
+ const formItemList = [
17
+ { prop: 'name', label: '姓名', required: true },
18
+ { prop: 'age', label: '年龄' },
19
+ ]
20
+
21
+ const FormDialog = useFormDialog({
22
+ title: '用户信息',
23
+ formItemList,
24
+ dialogProps: {
25
+ destroyOnClose: true, // 关闭时销毁对话框内容
26
+ },
27
+ })
28
+
29
+ const openDialog = async () => {
30
+ try {
31
+ const formData = await FormDialog.start()
32
+ console.log('表单数据', formData)
33
+ } catch (e) {
34
+ console.log('取消')
35
+ }
36
+ }
37
+ </script>
38
+ ```
39
+
40
+ ## Options
41
+
42
+ | 属性 | 说明 | 类型 | 默认值 |
43
+ |------|------|------|--------|
44
+ | title | 对话框标题 | `string` | - |
45
+ | width | 对话框宽度 | `string` | `'80%'` |
46
+ | dialogProps | 对话框属性,继承自 useDialog | `DialogOptions` | - |
47
+ | formData | 表单数据对象 | `object` | - |
48
+ | formItemList | 表单项配置,参考 [EpForm](./form.md) | `FormItemProps[]` | - |
49
+ | onBeforeConfirm | 确认前回调,可用于额外处理 | `(formData, resolve) => Promise<void>` | - |
50
+ | onBeforeCancel | 取消前回调 | `(formData, resolve) => Promise<void>` | - |
51
+
52
+ ## 自定义表单数据
53
+
54
+ ```tsx
55
+ const formData = reactive({
56
+ name: '',
57
+ age: '',
58
+ })
59
+
60
+ const FormDialog = useFormDialog({
61
+ title: '编辑用户',
62
+ formData, // 传入外部表单数据
63
+ formItemList,
64
+ })
65
+ ```
66
+
67
+ ## 确认前处理
68
+
69
+ ```tsx
70
+ const FormDialog = useFormDialog({
71
+ title: '提交表单',
72
+ formItemList,
73
+ onBeforeConfirm: async (formData, resolve) => {
74
+ // 可以在此处进行额外的异步操作
75
+ await api.submit(formData)
76
+ resolve(formData)
77
+ },
78
+ })
79
+ ```
80
+
81
+ ## 方法
82
+
83
+ | 方法 | 说明 | 类型 |
84
+ |------|------|------|
85
+ | start | 打开对话框并返回 Promise | `() => Promise<FormData>` |
86
+ | open | 打开对话框 | `() => void` |
87
+ | close | 关闭对话框 | `() => void` |