el-plus 0.0.113 → 0.0.115

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 (255) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +85 -85
  3. package/dist/index.css +1 -1
  4. package/dist/index.full.js +15 -5
  5. package/dist/index.full.min.js +4 -4
  6. package/dist/index.full.min.js.map +1 -1
  7. package/dist/index.full.min.mjs +4 -4
  8. package/dist/index.full.min.mjs.map +1 -1
  9. package/dist/index.full.mjs +15 -6
  10. package/docs/CHANGELOG.md +5 -5
  11. package/docs/api-examples.md +49 -49
  12. package/docs/components/attachment.md +118 -111
  13. package/docs/components/buttons.md +179 -179
  14. package/docs/components/custom-column.md +70 -70
  15. package/docs/components/date-picker-range.md +61 -61
  16. package/docs/components/dialog.md +104 -104
  17. package/docs/components/footer-info.md +101 -101
  18. package/docs/components/form.md +211 -211
  19. package/docs/components/header.md +117 -117
  20. package/docs/components/input.md +111 -111
  21. package/docs/components/link.md +63 -63
  22. package/docs/components/search-list-page.md +91 -91
  23. package/docs/components/select.md +249 -249
  24. package/docs/components/table.md +145 -145
  25. package/docs/components/title.md +70 -70
  26. package/docs/components/use-choose-dialog.md +114 -114
  27. package/docs/components/use-confirm-dialog.md +86 -86
  28. package/docs/components/use-form-dialog.md +85 -85
  29. package/docs/guide/markdown-examples.md +85 -85
  30. package/docs/hooks/use-navigation.md +131 -131
  31. package/docs/hooks/use-utils.md +162 -162
  32. package/docs/index.md +25 -25
  33. package/docs/overview.md +99 -99
  34. package/docs/pages/detail.md +66 -66
  35. package/docs/pages/list.md +74 -74
  36. package/docs/pages/router.md +151 -151
  37. package/es/components/attachment/index.d.ts +12 -2
  38. package/es/components/attachment/index.mjs +1 -1
  39. package/es/components/attachment/index.mjs.map +1 -1
  40. package/es/components/attachment/src/attachment.d.ts +6 -0
  41. package/es/components/attachment/src/attachment.mjs +7 -1
  42. package/es/components/attachment/src/attachment.mjs.map +1 -1
  43. package/es/components/attachment/src/attachment.vue.d.ts +5 -1
  44. package/es/components/attachment/src/attachment.vue2.mjs +7 -4
  45. package/es/components/attachment/src/attachment.vue2.mjs.map +1 -1
  46. package/es/components/attachment/src/use-attachment.mjs.map +1 -1
  47. package/es/components/buttons/index.mjs.map +1 -1
  48. package/es/components/buttons/src/buttons-vue.mjs.map +1 -1
  49. package/es/components/buttons/src/buttons.mjs.map +1 -1
  50. package/es/components/custom-column/index.mjs.map +1 -1
  51. package/es/components/custom-column/src/custom-column.mjs.map +1 -1
  52. package/es/components/custom-column/src/custom-column.vue2.mjs.map +1 -1
  53. package/es/components/date-picker-range/index.mjs.map +1 -1
  54. package/es/components/date-picker-range/src/date-picker-range.mjs.map +1 -1
  55. package/es/components/date-picker-range/src/date-picker-range.vue2.mjs.map +1 -1
  56. package/es/components/footer-info/index.mjs.map +1 -1
  57. package/es/components/footer-info/src/footer-info.mjs.map +1 -1
  58. package/es/components/footer-info/src/footer-info.vue2.mjs.map +1 -1
  59. package/es/components/form/index.mjs.map +1 -1
  60. package/es/components/form/src/form-item-vue.mjs.map +1 -1
  61. package/es/components/form/src/form-item.mjs.map +1 -1
  62. package/es/components/form/src/form.mjs.map +1 -1
  63. package/es/components/form/src/form.vue2.mjs.map +1 -1
  64. package/es/components/form/src/hooks/use-form-item.mjs.map +1 -1
  65. package/es/components/form/src/hooks/use-form.mjs.map +1 -1
  66. package/es/components/header/index.mjs.map +1 -1
  67. package/es/components/header/src/header.mjs.map +1 -1
  68. package/es/components/header/src/header.vue2.mjs.map +1 -1
  69. package/es/components/header/src/use-header.mjs.map +1 -1
  70. package/es/components/index.mjs +1 -1
  71. package/es/components/input/index.mjs.map +1 -1
  72. package/es/components/input/src/input.mjs.map +1 -1
  73. package/es/components/input/src/input.vue2.mjs.map +1 -1
  74. package/es/components/link/index.mjs.map +1 -1
  75. package/es/components/link/src/link.mjs.map +1 -1
  76. package/es/components/link/src/link.vue2.mjs.map +1 -1
  77. package/es/components/search-list-page/index.mjs.map +1 -1
  78. package/es/components/search-list-page/src/search-list-page.mjs.map +1 -1
  79. package/es/components/search-list-page/src/search-list-page.vue2.mjs.map +1 -1
  80. package/es/components/search-list-page/src/use-search-list-page.mjs.map +1 -1
  81. package/es/components/select/index.mjs.map +1 -1
  82. package/es/components/select/src/select.mjs.map +1 -1
  83. package/es/components/select/src/select.vue2.mjs.map +1 -1
  84. package/es/components/select/src/use-select.mjs.map +1 -1
  85. package/es/components/table/index.mjs.map +1 -1
  86. package/es/components/table/src/table.mjs.map +1 -1
  87. package/es/components/table/src/table.vue2.mjs.map +1 -1
  88. package/es/components/table/src/use-table.mjs.map +1 -1
  89. package/es/components/title/index.mjs.map +1 -1
  90. package/es/components/title/src/title.mjs.map +1 -1
  91. package/es/components/title/src/title.vue2.mjs.map +1 -1
  92. package/es/components/title/src/use-title.mjs.map +1 -1
  93. package/es/components/uni-vue/index.mjs.map +1 -1
  94. package/es/components/uni-vue/src/uni-vue.mjs.map +1 -1
  95. package/es/components/uni-vue/src/uni-vue.vue2.mjs.map +1 -1
  96. package/es/components/uni-vue/src/use-uni-vue.mjs.map +1 -1
  97. package/es/components.mjs.map +1 -1
  98. package/es/directives/permission/index.mjs.map +1 -1
  99. package/es/directives/repeat-click/index.mjs.map +1 -1
  100. package/es/hooks/dialog/use-choose-dialog.mjs.map +1 -1
  101. package/es/hooks/dialog/use-confirm-dialog.mjs.map +1 -1
  102. package/es/hooks/dialog/use-dialog.mjs.map +1 -1
  103. package/es/hooks/dialog/use-form-dialog.mjs.map +1 -1
  104. package/es/hooks/use-locale.mjs.map +1 -1
  105. package/es/hooks/use-navigation.mjs.map +1 -1
  106. package/es/hooks/use-request.mjs.map +1 -1
  107. package/es/hooks/use-template-promise.mjs.map +1 -1
  108. package/es/hooks/use-utils.mjs.map +1 -1
  109. package/es/index.mjs +1 -1
  110. package/es/index.mjs.map +1 -1
  111. package/es/locale/lang/en.mjs.map +1 -1
  112. package/es/locale/lang/zh-cn.mjs.map +1 -1
  113. package/es/package.json.mjs +1 -1
  114. package/es/plugins/globalProperties.mjs.map +1 -1
  115. package/es/types/global.d.ts +30 -30
  116. package/es/types/index.d.ts +2 -2
  117. package/es/types/utils.d.ts +19 -19
  118. package/es/utils/bem.mjs.map +1 -1
  119. package/es/utils/cookie.mjs.map +1 -1
  120. package/es/utils/dom.mjs.map +1 -1
  121. package/es/utils/env.mjs.map +1 -1
  122. package/es/utils/file.mjs.map +1 -1
  123. package/es/utils/http/core/modules/interceptor.mjs.map +1 -1
  124. package/es/utils/http/core/modules/loading.mjs.map +1 -1
  125. package/es/utils/http/core/preset-interceptors.mjs.map +1 -1
  126. package/es/utils/http/core/request-client.mjs.map +1 -1
  127. package/es/utils/http/index.mjs.map +1 -1
  128. package/es/utils/mitt.mjs.map +1 -1
  129. package/es/utils/navigation.mjs.map +1 -1
  130. package/es/utils/props.mjs.map +1 -1
  131. package/es/utils/time.mjs.map +1 -1
  132. package/es/utils/utils.mjs.map +1 -1
  133. package/es/utils/with-install.mjs.map +1 -1
  134. package/global.d.ts +21 -21
  135. package/lib/components/attachment/index.d.ts +12 -2
  136. package/lib/components/attachment/index.js +1 -0
  137. package/lib/components/attachment/index.js.map +1 -1
  138. package/lib/components/attachment/src/attachment.d.ts +6 -0
  139. package/lib/components/attachment/src/attachment.js +7 -0
  140. package/lib/components/attachment/src/attachment.js.map +1 -1
  141. package/lib/components/attachment/src/attachment.vue.d.ts +5 -1
  142. package/lib/components/attachment/src/attachment.vue2.js +6 -3
  143. package/lib/components/attachment/src/attachment.vue2.js.map +1 -1
  144. package/lib/components/attachment/src/use-attachment.js.map +1 -1
  145. package/lib/components/buttons/index.js.map +1 -1
  146. package/lib/components/buttons/src/buttons-vue.js.map +1 -1
  147. package/lib/components/buttons/src/buttons.js.map +1 -1
  148. package/lib/components/custom-column/index.js.map +1 -1
  149. package/lib/components/custom-column/src/custom-column.js.map +1 -1
  150. package/lib/components/custom-column/src/custom-column.vue2.js.map +1 -1
  151. package/lib/components/date-picker-range/index.js.map +1 -1
  152. package/lib/components/date-picker-range/src/date-picker-range.js.map +1 -1
  153. package/lib/components/date-picker-range/src/date-picker-range.vue2.js.map +1 -1
  154. package/lib/components/footer-info/index.js.map +1 -1
  155. package/lib/components/footer-info/src/footer-info.js.map +1 -1
  156. package/lib/components/footer-info/src/footer-info.vue2.js.map +1 -1
  157. package/lib/components/form/index.js.map +1 -1
  158. package/lib/components/form/src/form-item-vue.js.map +1 -1
  159. package/lib/components/form/src/form-item.js.map +1 -1
  160. package/lib/components/form/src/form.js.map +1 -1
  161. package/lib/components/form/src/form.vue2.js.map +1 -1
  162. package/lib/components/form/src/hooks/use-form-item.js.map +1 -1
  163. package/lib/components/form/src/hooks/use-form.js.map +1 -1
  164. package/lib/components/header/index.js.map +1 -1
  165. package/lib/components/header/src/header.js.map +1 -1
  166. package/lib/components/header/src/header.vue2.js.map +1 -1
  167. package/lib/components/header/src/use-header.js.map +1 -1
  168. package/lib/components/index.js +1 -0
  169. package/lib/components/index.js.map +1 -1
  170. package/lib/components/input/index.js.map +1 -1
  171. package/lib/components/input/src/input.js.map +1 -1
  172. package/lib/components/input/src/input.vue2.js.map +1 -1
  173. package/lib/components/link/index.js.map +1 -1
  174. package/lib/components/link/src/link.js.map +1 -1
  175. package/lib/components/link/src/link.vue2.js.map +1 -1
  176. package/lib/components/search-list-page/index.js.map +1 -1
  177. package/lib/components/search-list-page/src/search-list-page.js.map +1 -1
  178. package/lib/components/search-list-page/src/search-list-page.vue2.js.map +1 -1
  179. package/lib/components/search-list-page/src/use-search-list-page.js.map +1 -1
  180. package/lib/components/select/index.js.map +1 -1
  181. package/lib/components/select/src/select.js.map +1 -1
  182. package/lib/components/select/src/select.vue2.js.map +1 -1
  183. package/lib/components/select/src/use-select.js.map +1 -1
  184. package/lib/components/table/index.js.map +1 -1
  185. package/lib/components/table/src/table.js.map +1 -1
  186. package/lib/components/table/src/table.vue2.js.map +1 -1
  187. package/lib/components/table/src/use-table.js.map +1 -1
  188. package/lib/components/title/index.js.map +1 -1
  189. package/lib/components/title/src/title.js.map +1 -1
  190. package/lib/components/title/src/title.vue2.js.map +1 -1
  191. package/lib/components/title/src/use-title.js.map +1 -1
  192. package/lib/components/uni-vue/index.js.map +1 -1
  193. package/lib/components/uni-vue/src/uni-vue.js.map +1 -1
  194. package/lib/components/uni-vue/src/uni-vue.vue2.js.map +1 -1
  195. package/lib/components/uni-vue/src/use-uni-vue.js.map +1 -1
  196. package/lib/components.js.map +1 -1
  197. package/lib/directives/permission/index.js.map +1 -1
  198. package/lib/directives/repeat-click/index.js.map +1 -1
  199. package/lib/hooks/dialog/use-choose-dialog.js.map +1 -1
  200. package/lib/hooks/dialog/use-confirm-dialog.js.map +1 -1
  201. package/lib/hooks/dialog/use-dialog.js.map +1 -1
  202. package/lib/hooks/dialog/use-form-dialog.js.map +1 -1
  203. package/lib/hooks/use-locale.js.map +1 -1
  204. package/lib/hooks/use-navigation.js.map +1 -1
  205. package/lib/hooks/use-request.js.map +1 -1
  206. package/lib/hooks/use-template-promise.js.map +1 -1
  207. package/lib/hooks/use-utils.js.map +1 -1
  208. package/lib/index.js +1 -0
  209. package/lib/index.js.map +1 -1
  210. package/lib/locale/lang/en.js.map +1 -1
  211. package/lib/locale/lang/zh-cn.js.map +1 -1
  212. package/lib/package.json.js +1 -1
  213. package/lib/plugins/globalProperties.js.map +1 -1
  214. package/lib/types/global.d.ts +30 -30
  215. package/lib/types/index.d.ts +2 -2
  216. package/lib/types/utils.d.ts +19 -19
  217. package/lib/utils/bem.js.map +1 -1
  218. package/lib/utils/cookie.js.map +1 -1
  219. package/lib/utils/dom.js.map +1 -1
  220. package/lib/utils/env.js.map +1 -1
  221. package/lib/utils/file.js.map +1 -1
  222. package/lib/utils/http/core/modules/interceptor.js.map +1 -1
  223. package/lib/utils/http/core/modules/loading.js.map +1 -1
  224. package/lib/utils/http/core/preset-interceptors.js.map +1 -1
  225. package/lib/utils/http/core/request-client.js.map +1 -1
  226. package/lib/utils/http/index.js.map +1 -1
  227. package/lib/utils/mitt.js.map +1 -1
  228. package/lib/utils/navigation.js.map +1 -1
  229. package/lib/utils/props.js.map +1 -1
  230. package/lib/utils/time.js.map +1 -1
  231. package/lib/utils/utils.js.map +1 -1
  232. package/lib/utils/with-install.js.map +1 -1
  233. package/package.json +1 -1
  234. package/theme-chalk/base.css +1 -1
  235. package/theme-chalk/index.css +1 -1
  236. package/theme-chalk/src/attachment.scss +39 -39
  237. package/theme-chalk/src/base.scss +2 -2
  238. package/theme-chalk/src/buttons.scss +22 -22
  239. package/theme-chalk/src/common/common.scss +7 -4
  240. package/theme-chalk/src/common/transition.scss +9 -9
  241. package/theme-chalk/src/custom-column.scss +55 -55
  242. package/theme-chalk/src/dialog.scss +62 -62
  243. package/theme-chalk/src/footer-info.scss +18 -18
  244. package/theme-chalk/src/form.scss +80 -72
  245. package/theme-chalk/src/header.scss +19 -19
  246. package/theme-chalk/src/index.scss +15 -15
  247. package/theme-chalk/src/link.scss +5 -5
  248. package/theme-chalk/src/mixins/config.scss +3 -3
  249. package/theme-chalk/src/mixins/mixins.scss +37 -37
  250. package/theme-chalk/src/search-list-page.scss +22 -22
  251. package/theme-chalk/src/select.scss +10 -10
  252. package/theme-chalk/src/table.scss +91 -91
  253. package/theme-chalk/src/tabs.scss +55 -55
  254. package/theme-chalk/src/title.scss +52 -52
  255. package/theme-chalk/src/uni-vue.scss +10 -10
@@ -1,211 +1,211 @@
1
- # EpForm 表单容器
2
-
3
- 基于 el-form 封装,支持通过配置生成表单。
4
-
5
- ## 基本用法
6
-
7
- ```vue
8
- <template>
9
- <EpForm
10
- ref="epForm"
11
- v-model="formData"
12
- :formItemList="formItemList"
13
- />
14
- </template>
15
-
16
- <script setup lang="tsx">
17
- import { reactive, ref, useTemplateRef } from 'vue'
18
- import type { FormProps } from 'el-plus'
19
-
20
- const epForm = useTemplateRef('epForm')
21
- const formData = reactive({})
22
-
23
- const formItemList = ref<FormProps['formItemList']>([
24
- {
25
- prop: 'name',
26
- label: '名称',
27
- required: true,
28
- },
29
- {
30
- prop: 'type',
31
- label: '类型',
32
- type: 'EpSelect',
33
- props: {
34
- options: [
35
- { label: '类型1', value: '1' },
36
- { label: '类型2', value: '2' },
37
- ],
38
- },
39
- },
40
- ])
41
- </script>
42
- ```
43
- ## 表单数据
44
-
45
- **不需要预定义表单字段**,`reactive({})` 即可,组件会自动管理字段值。
46
-
47
- ```typescript
48
- // ✅ 正确:无需预定义字段
49
- const formData = reactive({})
50
-
51
- // ❌ 错误:不需要提前声明所有字段
52
- const formData = reactive({
53
- name: '',
54
- status: '',
55
- applicant: '',
56
- // ...
57
- })
58
- ```
59
-
60
- **仅需预定义以下特殊字段:**
61
-
62
- | 场景 | 需预定义的字段 | 示例 |
63
- |------|---------------|------|
64
- | 日期范围 | 开始和结束两个独立字段 | `orderDateStart: ''`, `orderDateEnd: ''` |
65
- | 表格数组 | 空数组 | `detailList: []` |
66
- | 附件数组 | 空数组 | `fileList: []` |
67
-
68
- ## Props
69
-
70
- | 属性 | 说明 | 类型 | 默认值 |
71
- |------|------|------|--------|
72
- | v-model | 表单数据 | `Record<string, any>` | `{}` |
73
- | formItemList | 表单项配置 | [`FormItemProps[]`](#formitemprops-配置) | `[]` |
74
- | col | 每行列数 | `number` | `4` |
75
- | isShowFold | 是否显示折叠 | `boolean` | `false` |
76
- | showFieldCount | 折叠时显示数量 | `number` | `8` |
77
- | labelWidth | 标签宽度 ^el^ | `string \| number` | `100` |
78
- | labelPosition | 标签位置 ^el^ | `'left' \| 'right' \| 'top'` | - |
79
- | size | 表单尺寸 ^el^ | `'large' \| 'default' \| 'small'` | `'small'` |
80
- | scrollIntoViewOptions | 滚动到错误项配置 ^el^ | `object` | `{ inline: 'center' }` |
81
-
82
- > ^el^ 表示继承自 [el-form](https://element-plus.org/zh-CN/component/form.html) 的属性
83
-
84
- ## FormItemProps 配置
85
-
86
- | 属性 | 说明 | 类型 | 默认值 |
87
- |------|------|------|--------|
88
- | type | 组件类型 | `string` | `'EpInput'` |
89
- | prop | 字段名 | `string` | - |
90
- | label | 标签文本 | `string` | - |
91
- | col | 占用列数 | `number` | - |
92
- | disabled | 是否禁用 | `boolean` | `false` |
93
- | show | 是否显示(支持函数) | `boolean \| () => boolean` | `true` |
94
- | hide | 是否隐藏(支持函数) | `boolean \| () => boolean` | `false` |
95
- | required | 是否必填 | `boolean` | `false` |
96
- | rules | 校验规则 | `FormItemRule[]` | - |
97
- | props | 传递给组件的属性 | `object` | - |
98
- | render | 自定义渲染 | `() => VNode` | - |
99
- | labelRender | 自定义标签渲染 | `({ label }) => VNode` | - |
100
- | isShowLabel | 是否显示标签 | `boolean` | `true` |
101
- | class | 样式类名 | `string` | - |
102
- | style | 行内样式 | `string \| CSSProperties` | - |
103
- | onChange | 值变化事件 | `(val, item?) => void` | - |
104
-
105
- ## Expose 方法
106
-
107
- | 方法 | 说明 | 类型 |
108
- |------|------|------|
109
- | validate | 表单验证 | `() => Promise<boolean>` |
110
- | resetFields | 重置表单 | `() => void` |
111
- | clearValidate | 清除验证 | `(props?: string[]) => void` |
112
- | getFormItemRenderRef | 获取表单项组件 ref | `(ref: string) => any` |
113
-
114
- ## 组件自由组合示例
115
-
116
- 在 formItemList 中可自由组合其他组件:
117
- - type:组件名字,优先使用 Ep 前缀的组件,如 EpInput、EpSelect 等,其次使用 Element Plus 的组件,如 ElInput、ElSelect 等。
118
- - 外层: EpFormItem的属性
119
- - props:传递给组件的属性
120
- - 事件:组件的事件,以 `on` 开头,如 onClick、onChange 等
121
-
122
-
123
- ```tsx
124
- const formItemList = computed<FormProps['formItemList']>(() => [
125
- // 标题分组
126
- {
127
- col: 24,
128
- type: 'EpTitle',
129
- props: {
130
- title: '基本信息',
131
- },
132
- },
133
- // 输入框
134
- {
135
- prop: 'name',
136
- label: '名称',
137
- required: true,
138
- },
139
- // 下拉选择
140
- {
141
- prop: 'type',
142
- label: '类型',
143
- type: 'EpSelect',
144
- props: {
145
- options: [],
146
- },
147
- },
148
- // 日期范围
149
- {
150
- prop: 'orderDate',
151
- label: '日期范围',
152
- type: 'EpDatePickerRange',
153
- props: {
154
- start: formData.orderDateStart,
155
- end: formData.orderDateEnd,
156
- },
157
- 'onUpdate:start': (val) => {
158
- formData.orderDateStart = val
159
- },
160
- 'onUpdate:end': (val) => {
161
- formData.orderDateEnd = val
162
- },
163
- },
164
- // 表格嵌套
165
- {
166
- col: 24,
167
- type: 'EpTable',
168
- props: {
169
- ref: 'detailTable',
170
- data: formData.detailList,
171
- columns: [],
172
- },
173
- },
174
- // 附件
175
- {
176
- col: 24,
177
- type: 'EpAttachment',
178
- props: {
179
- modelValue: formData.fileList,
180
- openType: 'normal',
181
- },
182
- },
183
- // 页脚信息
184
- {
185
- col: 24,
186
- type:'EpFooterInfo',
187
- props: {
188
- modelValue: formData,
189
- },
190
- }
191
- ])
192
- ```
193
-
194
- ## 验证示例
195
-
196
- ```ts
197
- const handleSave = async () => {
198
- const valid = await epForm.value?.validate()
199
- if (valid) {
200
- // 验证通过,提交数据
201
- }
202
- }
203
- ```
204
-
205
- ## 获取嵌套组件 ref
206
-
207
- ```ts
208
- // 获取 formItemList 中 props.ref='detailTable' 的组件
209
- const table = epForm.value?.getFormItemRenderRef('detailTable')
210
- const rows = table?.getSelectionRows()
211
- ```
1
+ # EpForm 表单容器
2
+
3
+ 基于 el-form 封装,支持通过配置生成表单。
4
+
5
+ ## 基本用法
6
+
7
+ ```vue
8
+ <template>
9
+ <EpForm
10
+ ref="epForm"
11
+ v-model="formData"
12
+ :formItemList="formItemList"
13
+ />
14
+ </template>
15
+
16
+ <script setup lang="tsx">
17
+ import { reactive, ref, useTemplateRef } from 'vue'
18
+ import type { FormProps } from 'el-plus'
19
+
20
+ const epForm = useTemplateRef('epForm')
21
+ const formData = reactive({})
22
+
23
+ const formItemList = ref<FormProps['formItemList']>([
24
+ {
25
+ prop: 'name',
26
+ label: '名称',
27
+ required: true,
28
+ },
29
+ {
30
+ prop: 'type',
31
+ label: '类型',
32
+ type: 'EpSelect',
33
+ props: {
34
+ options: [
35
+ { label: '类型1', value: '1' },
36
+ { label: '类型2', value: '2' },
37
+ ],
38
+ },
39
+ },
40
+ ])
41
+ </script>
42
+ ```
43
+ ## 表单数据
44
+
45
+ **不需要预定义表单字段**,`reactive({})` 即可,组件会自动管理字段值。
46
+
47
+ ```typescript
48
+ // ✅ 正确:无需预定义字段
49
+ const formData = reactive({})
50
+
51
+ // ❌ 错误:不需要提前声明所有字段
52
+ const formData = reactive({
53
+ name: '',
54
+ status: '',
55
+ applicant: '',
56
+ // ...
57
+ })
58
+ ```
59
+
60
+ **仅需预定义以下特殊字段:**
61
+
62
+ | 场景 | 需预定义的字段 | 示例 |
63
+ |------|---------------|------|
64
+ | 日期范围 | 开始和结束两个独立字段 | `orderDateStart: ''`, `orderDateEnd: ''` |
65
+ | 表格数组 | 空数组 | `detailList: []` |
66
+ | 附件数组 | 空数组 | `fileList: []` |
67
+
68
+ ## Props
69
+
70
+ | 属性 | 说明 | 类型 | 默认值 |
71
+ |------|------|------|--------|
72
+ | v-model | 表单数据 | `Record<string, any>` | `{}` |
73
+ | formItemList | 表单项配置 | [`FormItemProps[]`](#formitemprops-配置) | `[]` |
74
+ | col | 每行列数 | `number` | `4` |
75
+ | isShowFold | 是否显示折叠 | `boolean` | `false` |
76
+ | showFieldCount | 折叠时显示数量 | `number` | `8` |
77
+ | labelWidth | 标签宽度 ^el^ | `string \| number` | `100` |
78
+ | labelPosition | 标签位置 ^el^ | `'left' \| 'right' \| 'top'` | - |
79
+ | size | 表单尺寸 ^el^ | `'large' \| 'default' \| 'small'` | `'small'` |
80
+ | scrollIntoViewOptions | 滚动到错误项配置 ^el^ | `object` | `{ inline: 'center' }` |
81
+
82
+ > ^el^ 表示继承自 [el-form](https://element-plus.org/zh-CN/component/form.html) 的属性
83
+
84
+ ## FormItemProps 配置
85
+
86
+ | 属性 | 说明 | 类型 | 默认值 |
87
+ |------|------|------|--------|
88
+ | type | 组件类型 | `string` | `'EpInput'` |
89
+ | prop | 字段名 | `string` | - |
90
+ | label | 标签文本 | `string` | - |
91
+ | col | 占用列数 | `number` | - |
92
+ | disabled | 是否禁用 | `boolean` | `false` |
93
+ | show | 是否显示(支持函数) | `boolean \| () => boolean` | `true` |
94
+ | hide | 是否隐藏(支持函数) | `boolean \| () => boolean` | `false` |
95
+ | required | 是否必填 | `boolean` | `false` |
96
+ | rules | 校验规则 | `FormItemRule[]` | - |
97
+ | props | 传递给组件的属性 | `object` | - |
98
+ | render | 自定义渲染 | `() => VNode` | - |
99
+ | labelRender | 自定义标签渲染 | `({ label }) => VNode` | - |
100
+ | isShowLabel | 是否显示标签 | `boolean` | `true` |
101
+ | class | 样式类名 | `string` | - |
102
+ | style | 行内样式 | `string \| CSSProperties` | - |
103
+ | onChange | 值变化事件 | `(val, item?) => void` | - |
104
+
105
+ ## Expose 方法
106
+
107
+ | 方法 | 说明 | 类型 |
108
+ |------|------|------|
109
+ | validate | 表单验证 | `() => Promise<boolean>` |
110
+ | resetFields | 重置表单 | `() => void` |
111
+ | clearValidate | 清除验证 | `(props?: string[]) => void` |
112
+ | getFormItemRenderRef | 获取表单项组件 ref | `(ref: string) => any` |
113
+
114
+ ## 组件自由组合示例
115
+
116
+ 在 formItemList 中可自由组合其他组件:
117
+ - type:组件名字,优先使用 Ep 前缀的组件,如 EpInput、EpSelect 等,其次使用 Element Plus 的组件,如 ElInput、ElSelect 等。
118
+ - 外层: EpFormItem的属性
119
+ - props:传递给组件的属性
120
+ - 事件:组件的事件,以 `on` 开头,如 onClick、onChange 等
121
+
122
+
123
+ ```tsx
124
+ const formItemList = computed<FormProps['formItemList']>(() => [
125
+ // 标题分组
126
+ {
127
+ col: 24,
128
+ type: 'EpTitle',
129
+ props: {
130
+ title: '基本信息',
131
+ },
132
+ },
133
+ // 输入框
134
+ {
135
+ prop: 'name',
136
+ label: '名称',
137
+ required: true,
138
+ },
139
+ // 下拉选择
140
+ {
141
+ prop: 'type',
142
+ label: '类型',
143
+ type: 'EpSelect',
144
+ props: {
145
+ options: [],
146
+ },
147
+ },
148
+ // 日期范围
149
+ {
150
+ prop: 'orderDate',
151
+ label: '日期范围',
152
+ type: 'EpDatePickerRange',
153
+ props: {
154
+ start: formData.orderDateStart,
155
+ end: formData.orderDateEnd,
156
+ },
157
+ 'onUpdate:start': (val) => {
158
+ formData.orderDateStart = val
159
+ },
160
+ 'onUpdate:end': (val) => {
161
+ formData.orderDateEnd = val
162
+ },
163
+ },
164
+ // 表格嵌套
165
+ {
166
+ col: 24,
167
+ type: 'EpTable',
168
+ props: {
169
+ ref: 'detailTable',
170
+ data: formData.detailList,
171
+ columns: [],
172
+ },
173
+ },
174
+ // 附件
175
+ {
176
+ col: 24,
177
+ type: 'EpAttachment',
178
+ props: {
179
+ modelValue: formData.fileList,
180
+ openType: 'normal',
181
+ },
182
+ },
183
+ // 页脚信息
184
+ {
185
+ col: 24,
186
+ type:'EpFooterInfo',
187
+ props: {
188
+ modelValue: formData,
189
+ },
190
+ }
191
+ ])
192
+ ```
193
+
194
+ ## 验证示例
195
+
196
+ ```ts
197
+ const handleSave = async () => {
198
+ const valid = await epForm.value?.validate()
199
+ if (valid) {
200
+ // 验证通过,提交数据
201
+ }
202
+ }
203
+ ```
204
+
205
+ ## 获取嵌套组件 ref
206
+
207
+ ```ts
208
+ // 获取 formItemList 中 props.ref='detailTable' 的组件
209
+ const table = epForm.value?.getFormItemRenderRef('detailTable')
210
+ const rows = table?.getSelectionRows()
211
+ ```
@@ -1,117 +1,117 @@
1
- # EpHeader 顶部操作栏
2
-
3
- 详情页顶部操作栏组件,支持返回、按钮组、附件等功能。
4
-
5
- ## 基本用法
6
-
7
- ```vue
8
- <template>
9
- <EpHeader
10
- :buttons="headerButtons"
11
- />
12
- </template>
13
-
14
- <script setup lang="tsx">
15
- import type { HeaderProps } from 'el-plus'
16
-
17
- // 只放非内置的自定义按钮
18
- const headerButtons: HeaderProps['buttons'] = [
19
- { name: '提交审批', onClick: () => {} },
20
- { name: '取消审批', onClick: () => {} },
21
- { name: '作废', onClick: () => {} },
22
- ]
23
- </script>
24
- ```
25
-
26
- ## Props
27
-
28
- | 属性 | 说明 | 类型 | 默认值 |
29
- |------|------|------|--------|
30
- | buttons | 自定义按钮列表 | [`ButtonProps[]`](./buttons.md#buttonprops-配置) | `[]` |
31
- | defaultButtons | 默认内置按钮 | `('edit' \| 'save' \| 'cancel' \| 'refresh' \| 'auditLog')[]` | `['edit', 'save', 'cancel', 'refresh', 'auditLog']` |
32
- | mode | 页面模式 | `'add' \| 'edit' \| 'browse'` | - |
33
- | allowBack | 是否允许返回 | `boolean` | `true` |
34
- | name | 权限前缀 | `string` | - |
35
- | workflowId | 工作流ID,有值则显示审批日志按钮 | `string` | - |
36
- | isShowAttachmentButton | 显示附件按钮 | `boolean` | `false` |
37
- | fileList | 附件列表 | `Record<string, any>[]` | `[]` |
38
- | attachmentProps | 附件组件属性 | [`AttachmentProps`](./attachment.md#props) | `{}` |
39
-
40
- ## 注意事项
41
-
42
- ### defaultButtons 默认值
43
-
44
- `defaultButtons` 默认为内置按钮,无需显式设置。只有需要自定义内置按钮时,才需设置。
45
-
46
- ```json
47
- // ❌ 错误:无需设置默认值属性,因为默认值就是内置按钮
48
- { "type": "EpHeader", "props": { "defaultButtons": ["edit", "save", "cancel", "refresh", "auditLog"] } }
49
- // ✅ 正确:使用内置按钮
50
- { "type": "EpHeader" }
51
- // ✅ 正确:自定义内置按钮中的按钮, 只显示编辑和保存按钮
52
- { "type": "EpHeader", "props": { "defaultButtons": ["edit", "save"] } }
53
- ```
54
-
55
- ## 默认按钮说明
56
-
57
- | 按钮 | 说明 |
58
- |------|------|
59
- | edit | 编辑按钮 |
60
- | save | 保存按钮 |
61
- | cancel | 取消按钮 |
62
- | refresh | 刷新按钮 |
63
- | auditLog | 审批日志按钮,只有workflowId有值时才显示 |
64
-
65
- ## 带附件按钮
66
-
67
- ```vue
68
- <template>
69
- <EpHeader
70
- :buttons="headerButtons"
71
- is-show-attachment-button
72
- :file-list="formData.fileList"
73
- :attachment-props="attachmentProps"
74
- />
75
- </template>
76
-
77
- <script setup lang="tsx">
78
- import type { HeaderProps } from 'el-plus'
79
- // 自定义附件组件属性
80
- const attachmentProps: HeaderProps['attachmentProps'] = {
81
- formatColumns: [
82
- {
83
- prop: 'type',
84
- props: {
85
- options: [
86
- { label: '图片', value: 0 },
87
- { label: '附件', value: 2 },
88
- ],
89
- },
90
- },
91
- ],
92
- }
93
- </script>
94
- ```
95
-
96
- ## 在 Form 中使用
97
-
98
- EpHeader 也可以作为表单项放入 EpForm 中,作为表单的一部分:
99
-
100
- ```tsx
101
- const formItemList = ref<FormProps['formItemList']>([
102
- {
103
- col: 24,
104
- type: 'EpHeader',
105
- props: {
106
- buttons: [
107
- { name: '提交审批', type: 'primary', onClick: () => {} },
108
- { name: '取消审批', onClick: () => {} },
109
- { name: '作废', onClick: () => {} },
110
- ],
111
- isShowAttachmentButton: true,
112
- fileList: formData.fileList,
113
- },
114
- },
115
- // 其他表单项...
116
- ])
117
- ```
1
+ # EpHeader 顶部操作栏
2
+
3
+ 详情页顶部操作栏组件,支持返回、按钮组、附件等功能。
4
+
5
+ ## 基本用法
6
+
7
+ ```vue
8
+ <template>
9
+ <EpHeader
10
+ :buttons="headerButtons"
11
+ />
12
+ </template>
13
+
14
+ <script setup lang="tsx">
15
+ import type { HeaderProps } from 'el-plus'
16
+
17
+ // 只放非内置的自定义按钮
18
+ const headerButtons: HeaderProps['buttons'] = [
19
+ { name: '提交审批', onClick: () => {} },
20
+ { name: '取消审批', onClick: () => {} },
21
+ { name: '作废', onClick: () => {} },
22
+ ]
23
+ </script>
24
+ ```
25
+
26
+ ## Props
27
+
28
+ | 属性 | 说明 | 类型 | 默认值 |
29
+ |------|------|------|--------|
30
+ | buttons | 自定义按钮列表 | [`ButtonProps[]`](./buttons.md#buttonprops-配置) | `[]` |
31
+ | defaultButtons | 默认内置按钮 | `('edit' \| 'save' \| 'cancel' \| 'refresh' \| 'auditLog')[]` | `['edit', 'save', 'cancel', 'refresh', 'auditLog']` |
32
+ | mode | 页面模式 | `'add' \| 'edit' \| 'browse'` | - |
33
+ | allowBack | 是否允许返回 | `boolean` | `true` |
34
+ | name | 权限前缀 | `string` | - |
35
+ | workflowId | 工作流ID,有值则显示审批日志按钮 | `string` | - |
36
+ | isShowAttachmentButton | 显示附件按钮 | `boolean` | `false` |
37
+ | fileList | 附件列表 | `Record<string, any>[]` | `[]` |
38
+ | attachmentProps | 附件组件属性 | [`AttachmentProps`](./attachment.md#props) | `{}` |
39
+
40
+ ## 注意事项
41
+
42
+ ### defaultButtons 默认值
43
+
44
+ `defaultButtons` 默认为内置按钮,无需显式设置。只有需要自定义内置按钮时,才需设置。
45
+
46
+ ```json
47
+ // ❌ 错误:无需设置默认值属性,因为默认值就是内置按钮
48
+ { "type": "EpHeader", "props": { "defaultButtons": ["edit", "save", "cancel", "refresh", "auditLog"] } }
49
+ // ✅ 正确:使用内置按钮
50
+ { "type": "EpHeader" }
51
+ // ✅ 正确:自定义内置按钮中的按钮, 只显示编辑和保存按钮
52
+ { "type": "EpHeader", "props": { "defaultButtons": ["edit", "save"] } }
53
+ ```
54
+
55
+ ## 默认按钮说明
56
+
57
+ | 按钮 | 说明 |
58
+ |------|------|
59
+ | edit | 编辑按钮 |
60
+ | save | 保存按钮 |
61
+ | cancel | 取消按钮 |
62
+ | refresh | 刷新按钮 |
63
+ | auditLog | 审批日志按钮,只有workflowId有值时才显示 |
64
+
65
+ ## 带附件按钮
66
+
67
+ ```vue
68
+ <template>
69
+ <EpHeader
70
+ :buttons="headerButtons"
71
+ is-show-attachment-button
72
+ :file-list="formData.fileList"
73
+ :attachment-props="attachmentProps"
74
+ />
75
+ </template>
76
+
77
+ <script setup lang="tsx">
78
+ import type { HeaderProps } from 'el-plus'
79
+ // 自定义附件组件属性
80
+ const attachmentProps: HeaderProps['attachmentProps'] = {
81
+ formatColumns: [
82
+ {
83
+ prop: 'type',
84
+ props: {
85
+ options: [
86
+ { label: '图片', value: 0 },
87
+ { label: '附件', value: 2 },
88
+ ],
89
+ },
90
+ },
91
+ ],
92
+ }
93
+ </script>
94
+ ```
95
+
96
+ ## 在 Form 中使用
97
+
98
+ EpHeader 也可以作为表单项放入 EpForm 中,作为表单的一部分:
99
+
100
+ ```tsx
101
+ const formItemList = ref<FormProps['formItemList']>([
102
+ {
103
+ col: 24,
104
+ type: 'EpHeader',
105
+ props: {
106
+ buttons: [
107
+ { name: '提交审批', type: 'primary', onClick: () => {} },
108
+ { name: '取消审批', onClick: () => {} },
109
+ { name: '作废', onClick: () => {} },
110
+ ],
111
+ isShowAttachmentButton: true,
112
+ fileList: formData.fileList,
113
+ },
114
+ },
115
+ // 其他表单项...
116
+ ])
117
+ ```