vue3-components-plus 3.0.19 → 3.0.21

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 (73) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +22 -176
  3. package/dist/ComponentDemo/DialogDemo.vue +2 -2
  4. package/dist/ComponentDemo/FormDemo.vue +133 -6
  5. package/dist/ComponentDemo/NsTableDemo/index.vue +29 -31
  6. package/dist/api/types.d.ts +116 -116
  7. package/dist/vue3-components-plus.css +1 -1
  8. package/dist/vue3-components-plus.d.ts +0 -2
  9. package/dist/vue3-components-plus.js +457 -2231
  10. package/dist/vue3-components-plus.umd.cjs +1 -1
  11. package/package.json +1 -1
  12. package/vue3-components-plus.d.ts +0 -2
  13. package/dist/ComponentDemo/DynamicFormCascadeAsyncDemo.vue +0 -337
  14. package/dist/ComponentDemo/DynamicFormCascadeDemo.vue +0 -263
  15. package/dist/ComponentDemo/DynamicFormPlusDemo.vue +0 -176
  16. package/dist/ComponentDemo/FormDemo copy.vue +0 -714
  17. package/dist/ComponentDemo/TestFormConfig.js +0 -129
  18. package/dist/ComponentDemo/VideoDemo.vue +0 -303
  19. package/dist/cdn/ezuikit/ezuikit.js +0 -27
  20. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl1/HasSIMD/Decoder.js +0 -168
  21. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl1/NoSIMD/Decoder.js +0 -168
  22. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/hasWorker/HasSIMD/Decoder.js +0 -21
  23. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/hasWorker/HasSIMD/Decoder.wasm +0 -0
  24. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/hasWorker/HasSIMD/Decoder.worker.js +0 -1
  25. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/hasWorker/NoSIMD/Decoder.js +0 -21
  26. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/hasWorker/NoSIMD/Decoder.wasm +0 -0
  27. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/hasWorker/NoSIMD/Decoder.worker.js +0 -1
  28. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/noWorker/Decoder.js +0 -21
  29. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/noWorker/Decoder.wasm +0 -0
  30. package/dist/cdn/ezuikit/ezuikit_static/css/component.css +0 -1257
  31. package/dist/cdn/ezuikit/ezuikit_static/css/inspectTheme.css +0 -354
  32. package/dist/cdn/ezuikit/ezuikit_static/css/theme copy.css +0 -126
  33. package/dist/cdn/ezuikit/ezuikit_static/css/theme.css +0 -140
  34. package/dist/cdn/ezuikit/ezuikit_static/imgs/bg.png +0 -0
  35. package/dist/cdn/ezuikit/ezuikit_static/imgs/bg.svg +0 -33
  36. package/dist/cdn/ezuikit/ezuikit_static/imgs/empty.png +0 -0
  37. package/dist/cdn/ezuikit/ezuikit_static/imgs/end.png +0 -0
  38. package/dist/cdn/ezuikit/ezuikit_static/imgs/fallback.svg +0 -52
  39. package/dist/cdn/ezuikit/ezuikit_static/imgs/start.png +0 -0
  40. package/dist/cdn/ezuikit/ezuikit_static/rec/datepicker.js +0 -1522
  41. package/dist/cdn/ezuikit/ezuikit_static/rec/datepicker.min.css +0 -36
  42. package/dist/cdn/ezuikit/ezuikit_static/rec/datepicker.zh-CN.js +0 -19
  43. package/dist/cdn/ezuikit/ezuikit_static/rec/jquery.min.js +0 -2
  44. package/dist/cdn/ezuikit/ezuikit_static/speed/speed.css +0 -145
  45. package/dist/cdn/ezuikit/ezuikit_static/talk/adapeter.js +0 -5497
  46. package/dist/cdn/ezuikit/ezuikit_static/talk/janus.js +0 -3507
  47. package/dist/cdn/ezuikit/ezuikit_static/talk/tts-v4.js +0 -343
  48. package/dist/cdn/ezuikit.js +0 -27
  49. package/dist/cdn/h5player/h5player.min.js +0 -313
  50. package/dist/cdn/h5player/playctrl1/DecodeWorker.js +0 -642
  51. package/dist/cdn/h5player/playctrl1/Decoder.js +0 -1
  52. package/dist/cdn/h5player/playctrl1simd/DecodeWorker.js +0 -642
  53. package/dist/cdn/h5player/playctrl1simd/Decoder.js +0 -1
  54. package/dist/cdn/h5player/playctrl2/Decoder.js +0 -21
  55. package/dist/cdn/h5player/playctrl2/Decoder.wasm +0 -0
  56. package/dist/cdn/h5player/playctrl2/Decoder.worker.js +0 -1
  57. package/dist/cdn/h5player/playctrl3/Decoder.js +0 -21
  58. package/dist/cdn/h5player/playctrl3/Decoder.wasm +0 -0
  59. package/dist/cdn/h5player/playctrl3/Decoder.worker.js +0 -1
  60. package/dist/cdn/h5player/talk/AudioInterCom.js +0 -21
  61. package/dist/cdn/h5player/talk/AudioInterCom.wasm +0 -0
  62. package/dist/cdn/h5player/talkW/AudioInterCom.js +0 -21
  63. package/dist/cdn/h5player/talkW/AudioInterCom.wasm +0 -0
  64. package/dist/cdn/h5player/talkW/AudioInterCom.worker.js +0 -1
  65. package/dist/cdn/h5player/transform/libSystemTransform.js +0 -6525
  66. package/dist/cdn/h5player/transform/libSystemTransform.wasm +0 -0
  67. package/dist/cdn/h5player/transform/systemTransform-worker.js +0 -120
  68. package/dist/cdn/md5.js +0 -254
  69. package/dist/js/EasyPlayer-decode.js +0 -1
  70. package/dist/js/EasyPlayer-lib.js +0 -1
  71. package/dist/js/EasyPlayer-pro.js +0 -1
  72. package/dist/js/EasyPlayer-pro.wasm +0 -0
  73. package/dist/js/EasyPlayer-snap.wasm +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue3-components-plus",
3
- "version": "3.0.19",
3
+ "version": "3.0.21",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "files": [
@@ -89,7 +89,6 @@ declare module 'vue3-components-plus' {
89
89
  import type { App } from 'vue'
90
90
 
91
91
  const components: {
92
- NsVideo: any
93
92
  NsExcel: any
94
93
  NsPdf: any
95
94
  NsWord: any
@@ -195,7 +194,6 @@ declare module 'vue3-components-plus' {
195
194
  download,
196
195
  downLoadLocalFile,
197
196
  getTokenInfo,
198
- NsVideo,
199
197
  NsExcel,
200
198
  NsPdf,
201
199
  NsWord,
@@ -1,337 +0,0 @@
1
- <template>
2
- <div class="cascade-async-demo">
3
- <h1>级联表单示例 - 异步数据加载</h1>
4
-
5
- <el-card class="demo-card">
6
- <template #header>
7
- <span>产品分类级联(模拟异步加载)</span>
8
- </template>
9
-
10
- <DynamicFormPlus
11
- ref="formRef"
12
- v-model="formData"
13
- :config="formConfig"
14
- :col-span="12"
15
- :gutter="16"
16
- label-width="120px"
17
- @submit="handleSubmit"
18
- />
19
- </el-card>
20
-
21
- <el-card class="demo-card" style="margin-top: 20px">
22
- <template #header>
23
- <span>表单数据</span>
24
- </template>
25
- <pre>{{ JSON.stringify(formData, null, 2) }}</pre>
26
- </el-card>
27
- </div>
28
- </template>
29
-
30
- <script setup lang="ts">
31
- import { ref } from 'vue'
32
- import { ElMessage } from 'element-plus'
33
- import { DynamicFormPlus } from '../../packages/components/DynamicFormPlus'
34
- import type { FormConfig } from '../../packages/components/DynamicFormPlus'
35
-
36
- // 模拟异步 API 请求
37
- const mockApiDelay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))
38
-
39
- // 模拟获取一级分类
40
- async function fetchCategories() {
41
- await mockApiDelay(500)
42
- return [
43
- { label: '电子产品', value: 'electronics' },
44
- { label: '服装鞋帽', value: 'clothing' },
45
- { label: '食品饮料', value: 'food' },
46
- ]
47
- }
48
-
49
- // 模拟获取二级分类
50
- async function fetchSubCategories(categoryId: string) {
51
- await mockApiDelay(500)
52
- const subCategoriesMap: Record<string, Array<{ label: string; value: string }>> = {
53
- electronics: [
54
- { label: '手机', value: 'phone' },
55
- { label: '电脑', value: 'computer' },
56
- { label: '相机', value: 'camera' },
57
- ],
58
- clothing: [
59
- { label: '男装', value: 'mens' },
60
- { label: '女装', value: 'womens' },
61
- { label: '童装', value: 'kids' },
62
- ],
63
- food: [
64
- { label: '零食', value: 'snacks' },
65
- { label: '饮料', value: 'drinks' },
66
- { label: '水果', value: 'fruits' },
67
- ],
68
- }
69
- return subCategoriesMap[categoryId] || []
70
- }
71
-
72
- // 模拟获取品牌列表
73
- async function fetchBrands(subCategoryId: string) {
74
- await mockApiDelay(500)
75
- const brandsMap: Record<string, Array<{ label: string; value: string }>> = {
76
- phone: [
77
- { label: '苹果', value: 'apple' },
78
- { label: '华为', value: 'huawei' },
79
- { label: '小米', value: 'xiaomi' },
80
- ],
81
- computer: [
82
- { label: '联想', value: 'lenovo' },
83
- { label: '戴尔', value: 'dell' },
84
- { label: '惠普', value: 'hp' },
85
- ],
86
- camera: [
87
- { label: '佳能', value: 'canon' },
88
- { label: '尼康', value: 'nikon' },
89
- { label: '索尼', value: 'sony' },
90
- ],
91
- mens: [
92
- { label: '耐克', value: 'nike' },
93
- { label: '阿迪达斯', value: 'adidas' },
94
- { label: '优衣库', value: 'uniqlo' },
95
- ],
96
- womens: [
97
- { label: 'ZARA', value: 'zara' },
98
- { label: 'H&M', value: 'hm' },
99
- { label: '优衣库', value: 'uniqlo' },
100
- ],
101
- kids: [
102
- { label: '巴拉巴拉', value: 'balabala' },
103
- { label: '安奈儿', value: 'annil' },
104
- { label: '迪士尼', value: 'disney' },
105
- ],
106
- snacks: [
107
- { label: '三只松鼠', value: 'squirrel' },
108
- { label: '良品铺子', value: 'bestore' },
109
- { label: '百草味', value: 'herb' },
110
- ],
111
- drinks: [
112
- { label: '可口可乐', value: 'cocacola' },
113
- { label: '百事可乐', value: 'pepsi' },
114
- { label: '农夫山泉', value: 'nongfu' },
115
- ],
116
- fruits: [
117
- { label: '佳沛', value: 'zespri' },
118
- { label: '都乐', value: 'dole' },
119
- { label: '新奇士', value: 'sunkist' },
120
- ],
121
- }
122
- return brandsMap[subCategoryId] || []
123
- }
124
-
125
- // 表单数据
126
- const formData = ref({
127
- category: '',
128
- subCategory: '',
129
- brand: '',
130
- productName: '',
131
- price: 0,
132
- })
133
-
134
- // 表单配置
135
- const formConfig: FormConfig = {
136
- items: [
137
- {
138
- prop: 'category',
139
- label: '一级分类',
140
- component: 'el-select',
141
- componentProps: {
142
- placeholder: '请选择分类',
143
- clearable: true,
144
- loading: false,
145
- },
146
- rules: [{ required: true, message: '请选择一级分类', trigger: 'change' }],
147
- span: 12,
148
- },
149
- {
150
- prop: 'subCategory',
151
- label: '二级分类',
152
- component: 'el-select',
153
- componentProps: {
154
- placeholder: '请先选择一级分类',
155
- clearable: true,
156
- disabled: true,
157
- loading: false,
158
- },
159
- rules: [{ required: true, message: '请选择二级分类', trigger: 'change' }],
160
- span: 12,
161
- // 级联配置:依赖一级分类
162
- cascade: {
163
- dependOn: 'category',
164
- clearFields: ['subCategory', 'brand'], // 一级分类变化时清除二级分类和品牌
165
- handler: async ({ dependValues, setComponentProps, clearValue }) => {
166
- const category = dependValues.category
167
-
168
- if (!category) {
169
- setComponentProps({
170
- placeholder: '请先选择一级分类',
171
- disabled: true,
172
- loading: false,
173
- options: [],
174
- })
175
- clearValue()
176
- return
177
- }
178
-
179
- // 显示加载状态
180
- setComponentProps({
181
- placeholder: '加载中...',
182
- disabled: true,
183
- loading: true,
184
- options: [],
185
- })
186
-
187
- try {
188
- // 异步加载二级分类数据
189
- const subCategories = await fetchSubCategories(category)
190
-
191
- setComponentProps({
192
- placeholder: '请选择二级分类',
193
- disabled: false,
194
- loading: false,
195
- options: subCategories,
196
- })
197
- } catch (error) {
198
- console.error('加载二级分类失败:', error)
199
- setComponentProps({
200
- placeholder: '加载失败,请重试',
201
- disabled: true,
202
- loading: false,
203
- options: [],
204
- })
205
- }
206
- },
207
- },
208
- },
209
- {
210
- prop: 'brand',
211
- label: '品牌',
212
- component: 'el-select',
213
- componentProps: {
214
- placeholder: '请先选择二级分类',
215
- clearable: true,
216
- disabled: true,
217
- loading: false,
218
- },
219
- rules: [{ required: true, message: '请选择品牌', trigger: 'change' }],
220
- span: 12,
221
- // 级联配置:依赖二级分类
222
- cascade: {
223
- dependOn: 'subCategory',
224
- clearFields: ['brand'], // 二级分类变化时清除品牌
225
- handler: async ({ dependValues, setComponentProps, clearValue }) => {
226
- const subCategory = dependValues.subCategory
227
-
228
- if (!subCategory) {
229
- setComponentProps({
230
- placeholder: '请先选择二级分类',
231
- disabled: true,
232
- loading: false,
233
- options: [],
234
- })
235
- clearValue()
236
- return
237
- }
238
-
239
- // 显示加载状态
240
- setComponentProps({
241
- placeholder: '加载中...',
242
- disabled: true,
243
- loading: true,
244
- options: [],
245
- })
246
-
247
- try {
248
- // 异步加载品牌数据
249
- const brands = await fetchBrands(subCategory)
250
-
251
- setComponentProps({
252
- placeholder: '请选择品牌',
253
- disabled: false,
254
- loading: false,
255
- options: brands,
256
- })
257
- } catch (error) {
258
- console.error('加载品牌失败:', error)
259
- setComponentProps({
260
- placeholder: '加载失败,请重试',
261
- disabled: true,
262
- loading: false,
263
- options: [],
264
- })
265
- }
266
- },
267
- },
268
- },
269
- {
270
- prop: 'productName',
271
- label: '产品名称',
272
- component: 'el-input',
273
- componentProps: {
274
- placeholder: '请输入产品名称',
275
- clearable: true,
276
- },
277
- rules: [{ required: true, message: '请输入产品名称', trigger: 'blur' }],
278
- span: 12,
279
- },
280
- {
281
- prop: 'price',
282
- label: '价格',
283
- component: 'el-input-number',
284
- componentProps: {
285
- min: 0,
286
- precision: 2,
287
- controlsPosition: 'right',
288
- },
289
- rules: [{ required: true, message: '请输入价格', trigger: 'blur' }],
290
- span: 12,
291
- },
292
- ],
293
- }
294
-
295
- // 初始化时加载一级分类
296
- ;(async () => {
297
- try {
298
- const categories = await fetchCategories()
299
- formConfig.items[0].componentProps!.options = categories
300
- } catch (error) {
301
- console.error('加载一级分类失败:', error)
302
- ElMessage.error('加载分类数据失败')
303
- }
304
- })()
305
-
306
- // 表单引用
307
- const formRef = ref()
308
-
309
- // 处理提交
310
- function handleSubmit(data: Record<string, any>) {
311
- console.log('表单提交:', data)
312
- ElMessage.success('表单提交成功!')
313
- }
314
- </script>
315
-
316
- <style scoped lang="scss">
317
- .cascade-async-demo {
318
- padding: 20px;
319
-
320
- h1 {
321
- margin-bottom: 20px;
322
- font-size: 24px;
323
- font-weight: bold;
324
- }
325
-
326
- .demo-card {
327
- margin-bottom: 20px;
328
- }
329
-
330
- pre {
331
- background-color: #f5f5f5;
332
- padding: 12px;
333
- border-radius: 4px;
334
- overflow-x: auto;
335
- }
336
- }
337
- </style>
@@ -1,263 +0,0 @@
1
- <template>
2
- <div class="cascade-demo">
3
- <h1>级联表单示例</h1>
4
-
5
- <el-card class="demo-card">
6
- <template #header>
7
- <span>省市区三级联动</span>
8
- </template>
9
-
10
- <DynamicFormPlus
11
- ref="formRef"
12
- v-model="formData"
13
- :config="formConfig"
14
- :col-span="8"
15
- :gutter="16"
16
- label-width="100px"
17
- @submit="handleSubmit"
18
- />
19
- </el-card>
20
-
21
- <el-card class="demo-card" style="margin-top: 20px">
22
- <template #header>
23
- <span>表单数据</span>
24
- </template>
25
- <pre>{{ JSON.stringify(formData, null, 2) }}</pre>
26
- </el-card>
27
- </div>
28
- </template>
29
-
30
- <script setup lang="ts">
31
- import { ref } from 'vue'
32
- import { ElMessage } from 'element-plus'
33
- import { DynamicFormPlus } from '../../packages/components/DynamicFormPlus'
34
- import type { FormConfig } from '../../packages/components/DynamicFormPlus'
35
-
36
- // 模拟数据源
37
- const provinces = [
38
- { label: '广东省', value: 'guangdong' },
39
- { label: '浙江省', value: 'zhejiang' },
40
- { label: '江苏省', value: 'jiangsu' },
41
- ]
42
-
43
- const citiesMap: Record<string, Array<{ label: string; value: string }>> = {
44
- guangdong: [
45
- { label: '广州市', value: 'guangzhou' },
46
- { label: '深圳市', value: 'shenzhen' },
47
- { label: '东莞市', value: 'dongguan' },
48
- ],
49
- zhejiang: [
50
- { label: '杭州市', value: 'hangzhou' },
51
- { label: '宁波市', value: 'ningbo' },
52
- { label: '温州市', value: 'wenzhou' },
53
- ],
54
- jiangsu: [
55
- { label: '南京市', value: 'nanjing' },
56
- { label: '苏州市', value: 'suzhou' },
57
- { label: '无锡市', value: 'wuxi' },
58
- ],
59
- }
60
-
61
- const districtsMap: Record<string, Array<{ label: string; value: string }>> = {
62
- guangzhou: [
63
- { label: '天河区', value: 'tianhe' },
64
- { label: '越秀区', value: 'yuexiu' },
65
- { label: '海珠区', value: 'haizhu' },
66
- ],
67
- shenzhen: [
68
- { label: '南山区', value: 'nanshan' },
69
- { label: '福田区', value: 'futian' },
70
- { label: '罗湖区', value: 'luohu' },
71
- ],
72
- dongguan: [
73
- { label: '莞城区', value: 'guancheng' },
74
- { label: '南城区', value: 'nancheng' },
75
- { label: '东城区', value: 'dongcheng' },
76
- ],
77
- hangzhou: [
78
- { label: '西湖区', value: 'xihu' },
79
- { label: '滨江区', value: 'binjiang' },
80
- { label: '余杭区', value: 'yuhang' },
81
- ],
82
- ningbo: [
83
- { label: '海曙区', value: 'haishu' },
84
- { label: '江北区', value: 'jiangbei' },
85
- { label: '鄞州区', value: 'yinzhou' },
86
- ],
87
- wenzhou: [
88
- { label: '鹿城区', value: 'lucheng' },
89
- { label: '龙湾区', value: 'longwan' },
90
- { label: '瓯海区', value: 'ouhai' },
91
- ],
92
- nanjing: [
93
- { label: '玄武区', value: 'xuanwu' },
94
- { label: '秦淮区', value: 'qinhuai' },
95
- { label: '建邺区', value: 'jianye' },
96
- ],
97
- suzhou: [
98
- { label: '姑苏区', value: 'gusu' },
99
- { label: '吴中区', value: 'wuzhong' },
100
- { label: '相城区', value: 'xiangcheng' },
101
- ],
102
- wuxi: [
103
- { label: '梁溪区', value: 'liangxi' },
104
- { label: '滨湖区', value: 'binhu' },
105
- { label: '惠山区', value: 'huishan' },
106
- ],
107
- }
108
-
109
- // 表单数据
110
- const formData = ref({
111
- province: '',
112
- city: '',
113
- district: '',
114
- address: '',
115
- })
116
-
117
- // 表单配置
118
- const formConfig: FormConfig = {
119
- items: [
120
- {
121
- prop: 'province',
122
- label: '省份',
123
- component: 'el-select',
124
- componentProps: {
125
- placeholder: '请选择省份',
126
- clearable: true,
127
- },
128
- rules: [{ required: true, message: '请选择省份', trigger: 'change' }],
129
- span: 8,
130
- // 静态数据源
131
- valueTransform: {
132
- input: (value) => value,
133
- output: (value) => value,
134
- },
135
- },
136
- {
137
- prop: 'city',
138
- label: '城市',
139
- component: 'el-select',
140
- componentProps: {
141
- placeholder: '请先选择省份',
142
- clearable: true,
143
- disabled: true,
144
- },
145
- rules: [{ required: true, message: '请选择城市', trigger: 'change' }],
146
- span: 8,
147
- // 级联配置:依赖省份字段
148
- cascade: {
149
- dependOn: 'province',
150
- clearFields: ['city', 'district'], // 省份变化时清除城市和区县
151
- handler: ({ dependValues, setComponentProps, clearValue }) => {
152
- const province = dependValues.province
153
-
154
- if (!province) {
155
- // 如果省份为空,禁用城市选择器
156
- setComponentProps({
157
- placeholder: '请先选择省份',
158
- disabled: true,
159
- options: [],
160
- })
161
- clearValue()
162
- return
163
- }
164
-
165
- // 根据省份加载城市数据
166
- const cities = citiesMap[province] || []
167
- setComponentProps({
168
- placeholder: '请选择城市',
169
- disabled: false,
170
- options: cities,
171
- })
172
- },
173
- },
174
- },
175
- {
176
- prop: 'district',
177
- label: '区县',
178
- component: 'el-select',
179
- componentProps: {
180
- placeholder: '请先选择城市',
181
- clearable: true,
182
- disabled: true,
183
- },
184
- rules: [{ required: true, message: '请选择区县', trigger: 'change' }],
185
- span: 8,
186
- // 级联配置:依赖城市字段
187
- cascade: {
188
- dependOn: 'city',
189
- clearFields: ['district'], // 城市变化时清除区县
190
- handler: ({ dependValues, setComponentProps, clearValue }) => {
191
- const city = dependValues.city
192
-
193
- if (!city) {
194
- // 如果城市为空,禁用区县选择器
195
- setComponentProps({
196
- placeholder: '请先选择城市',
197
- disabled: true,
198
- options: [],
199
- })
200
- clearValue()
201
- return
202
- }
203
-
204
- // 根据城市加载区县数据
205
- const districts = districtsMap[city] || []
206
- setComponentProps({
207
- placeholder: '请选择区县',
208
- disabled: false,
209
- options: districts,
210
- })
211
- },
212
- },
213
- },
214
- {
215
- prop: 'address',
216
- label: '详细地址',
217
- component: 'el-input',
218
- componentProps: {
219
- type: 'textarea',
220
- rows: 3,
221
- placeholder: '请输入详细地址',
222
- },
223
- rules: [{ required: true, message: '请输入详细地址', trigger: 'blur' }],
224
- span: 24,
225
- },
226
- ],
227
- }
228
-
229
- // 为省份选择器添加静态选项
230
- formConfig.items[0].componentProps!.options = provinces
231
-
232
- // 表单引用
233
- const formRef = ref()
234
-
235
- // 处理提交
236
- function handleSubmit(data: Record<string, any>) {
237
- console.log('表单提交:', data)
238
- ElMessage.success('表单提交成功!')
239
- }
240
- </script>
241
-
242
- <style scoped lang="scss">
243
- .cascade-demo {
244
- padding: 20px;
245
-
246
- h1 {
247
- margin-bottom: 20px;
248
- font-size: 24px;
249
- font-weight: bold;
250
- }
251
-
252
- .demo-card {
253
- margin-bottom: 20px;
254
- }
255
-
256
- pre {
257
- background-color: #f5f5f5;
258
- padding: 12px;
259
- border-radius: 4px;
260
- overflow-x: auto;
261
- }
262
- }
263
- </style>