iov-pro-components 0.0.3

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 (133) hide show
  1. package/.eslintignore +5 -0
  2. package/.eslintrc.js +192 -0
  3. package/.gitignore +3 -0
  4. package/README.md +4 -0
  5. package/babel.config.js +5 -0
  6. package/docs/.vuepress/config.js +169 -0
  7. package/docs/.vuepress/styles/index.styl +62 -0
  8. package/docs/.vuepress/styles/palette.styl +20 -0
  9. package/docs/.vuepress/theme/enhanceApp.js +100 -0
  10. package/docs/.vuepress/theme/index.js +3 -0
  11. package/docs/README.md +13 -0
  12. package/docs/components/description.md +519 -0
  13. package/docs/components/dialog-select.md +91 -0
  14. package/docs/components/display.md +36 -0
  15. package/docs/components/enums.md +33 -0
  16. package/docs/components/icon.md +406 -0
  17. package/docs/components/link-group.md +39 -0
  18. package/docs/components/page-detail.md +48 -0
  19. package/docs/components/page-module.md +51 -0
  20. package/docs/components/pro-form.md +958 -0
  21. package/docs/components/pro-table.md +683 -0
  22. package/docs/components/request.md +44 -0
  23. package/docs/components/search-table.md +963 -0
  24. package/docs/components/space.md +35 -0
  25. package/docs/components/sub-title.md +24 -0
  26. package/docs/components/submit-module.md +24 -0
  27. package/docs/template/add.md +124 -0
  28. package/docs/template/confirm.md +28 -0
  29. package/docs/template/detail.md +240 -0
  30. package/docs/template/dialog.md +339 -0
  31. package/docs/template/list.md +464 -0
  32. package/docs/template/tabs-mini.md +32 -0
  33. package/docs/template/tabs.md +32 -0
  34. package/jsconfig.json +19 -0
  35. package/lib/iov-pro-components.css +1 -0
  36. package/lib/iov-pro-components.min.js +7 -0
  37. package/lib/postcss.config.js +8 -0
  38. package/package.json +75 -0
  39. package/patches/vue-server-renderer+2.7.16.patch +13 -0
  40. package/rollup.config.mjs +79 -0
  41. package/src/App.vue +103 -0
  42. package/src/main.js +33 -0
  43. package/src/packages/column-tooltip/index.js +7 -0
  44. package/src/packages/column-tooltip/src/main.vue +127 -0
  45. package/src/packages/description/index.js +7 -0
  46. package/src/packages/description/src/main.vue +375 -0
  47. package/src/packages/description/src/text.vue +103 -0
  48. package/src/packages/dialog-select/index.js +7 -0
  49. package/src/packages/dialog-select/src/main.vue +308 -0
  50. package/src/packages/display/index.js +7 -0
  51. package/src/packages/display/src/main.vue +44 -0
  52. package/src/packages/enums/index.js +7 -0
  53. package/src/packages/enums/src/main.vue +23 -0
  54. package/src/packages/export/index.js +7 -0
  55. package/src/packages/export/src/main.vue +316 -0
  56. package/src/packages/fixed-button-group/index.js +7 -0
  57. package/src/packages/fixed-button-group/src/main.vue +104 -0
  58. package/src/packages/form/index.js +7 -0
  59. package/src/packages/form/src/collapse.vue +149 -0
  60. package/src/packages/form/src/main.vue +1190 -0
  61. package/src/packages/form-collapse/index.js +7 -0
  62. package/src/packages/index.js +86 -0
  63. package/src/packages/link-group/index.js +7 -0
  64. package/src/packages/link-group/src/main.vue +52 -0
  65. package/src/packages/page-detail/index.js +7 -0
  66. package/src/packages/page-detail/src/main.vue +123 -0
  67. package/src/packages/page-module/index.js +7 -0
  68. package/src/packages/page-module/src/main.vue +56 -0
  69. package/src/packages/preview/index.js +7 -0
  70. package/src/packages/preview/src/eval-image-viewer.js +50 -0
  71. package/src/packages/preview/src/image-viewer.vue +366 -0
  72. package/src/packages/preview/src/main.vue +97 -0
  73. package/src/packages/request/index.js +7 -0
  74. package/src/packages/request/src/main.vue +125 -0
  75. package/src/packages/search-table/index.js +7 -0
  76. package/src/packages/search-table/src/inner-tabs.vue +237 -0
  77. package/src/packages/search-table/src/main.vue +472 -0
  78. package/src/packages/search-table/src/outer-tabs.vue +45 -0
  79. package/src/packages/search-table-inner-tabs/index.js +7 -0
  80. package/src/packages/search-table-outer-tabs/index.js +7 -0
  81. package/src/packages/space/index.js +7 -0
  82. package/src/packages/space/src/main.vue +74 -0
  83. package/src/packages/sub-title/index.js +7 -0
  84. package/src/packages/sub-title/src/main.vue +70 -0
  85. package/src/packages/submit-module/index.js +7 -0
  86. package/src/packages/submit-module/src/main.vue +67 -0
  87. package/src/packages/table/index.js +7 -0
  88. package/src/packages/table/src/filter.vue +89 -0
  89. package/src/packages/table/src/main.vue +668 -0
  90. package/src/packages/table/src/search.vue +90 -0
  91. package/src/packages/table/src/sort.vue +118 -0
  92. package/src/packages/theme/index.scss +15 -0
  93. package/src/packages/theme/src/column-tooltip.scss +23 -0
  94. package/src/packages/theme/src/common/color.scss +134 -0
  95. package/src/packages/theme/src/description.scss +56 -0
  96. package/src/packages/theme/src/dialog-select.scss +32 -0
  97. package/src/packages/theme/src/fixed-button-group.scss +25 -0
  98. package/src/packages/theme/src/form.scss +11 -0
  99. package/src/packages/theme/src/link-group.scss +43 -0
  100. package/src/packages/theme/src/page-detail.scss +61 -0
  101. package/src/packages/theme/src/page-module.scss +46 -0
  102. package/src/packages/theme/src/preview.scss +67 -0
  103. package/src/packages/theme/src/search-table.scss +185 -0
  104. package/src/packages/theme/src/space.scss +12 -0
  105. package/src/packages/theme/src/sub-title.scss +47 -0
  106. package/src/packages/theme/src/submit-module.scss +13 -0
  107. package/src/packages/theme/src/table.scss +129 -0
  108. package/src/packages/theme/src/toolbar.scss +109 -0
  109. package/src/packages/toolbar/index.js +7 -0
  110. package/src/packages/toolbar/src/main.vue +126 -0
  111. package/src/packages/toolbar/src/setting.vue +217 -0
  112. package/src/packages/toolbar/src/style.vue +68 -0
  113. package/src/packages/toolbar/src/zoom.vue +65 -0
  114. package/src/router.js +83 -0
  115. package/src/utils/config-center.js +218 -0
  116. package/src/utils/function-eval.js +84 -0
  117. package/src/utils/index.js +104 -0
  118. package/src/views/column-tooltip.vue +37 -0
  119. package/src/views/components/OtherSelect.vue +18 -0
  120. package/src/views/description.vue +60 -0
  121. package/src/views/detail.vue +146 -0
  122. package/src/views/directive/number.js +82 -0
  123. package/src/views/enums.vue +22 -0
  124. package/src/views/export.vue +9 -0
  125. package/src/views/form-collapse.vue +185 -0
  126. package/src/views/form.vue +402 -0
  127. package/src/views/link-group.vue +16 -0
  128. package/src/views/preview.vue +33 -0
  129. package/src/views/request.vue +56 -0
  130. package/src/views/search-table.vue +297 -0
  131. package/src/views/table.vue +145 -0
  132. package/src/views/toolbar.vue +30 -0
  133. package/vue.config.js +22 -0
@@ -0,0 +1,958 @@
1
+ # 表单 ProForm
2
+ 使用 `schema` 的方式构建表单,并支持多样化的数据处理。
3
+
4
+ ## 基础使用
5
+
6
+ ::: demo
7
+ ```html
8
+ <template>
9
+ <iov-pro-form
10
+ v-model="formData"
11
+ :items="ITEMS"
12
+ />
13
+ </template>
14
+
15
+ <script>
16
+ export default {
17
+ data() {
18
+ const SEX_OPTION = [
19
+ { label: '男', value: 1 },
20
+ { label: '女', value: 0 }
21
+ ]
22
+
23
+ return {
24
+ formData: {},
25
+ ITEMS: [
26
+ {
27
+ label: '姓名',
28
+ name: 'name',
29
+ type: 'input'
30
+ },
31
+ {
32
+ label: '性别',
33
+ name: 'sex',
34
+ type: 'select',
35
+ options: SEX_OPTION
36
+ }
37
+ ]
38
+ }
39
+ }
40
+ }
41
+ </script>
42
+ ```
43
+ :::
44
+
45
+ ## 参数解构
46
+
47
+ ::: demo
48
+ ```html
49
+ <template>
50
+ <iov-pro-space space="12px">
51
+ <iov-pro-form
52
+ v-model="formData"
53
+ :items="ITEMS"
54
+ />
55
+ <div style="font-size: 12px;font-weight: bold;">当前表单数据: {{ formData }}</div>
56
+ </iov-pro-space>
57
+ </template>
58
+
59
+ <script>
60
+ export default {
61
+ data() {
62
+ const SEX_OPTION = [
63
+ { label: '男', value: 1 },
64
+ { label: '女', value: 0 }
65
+ ]
66
+
67
+ return {
68
+ formData: {},
69
+ ITEMS: [
70
+ {
71
+ label: '姓名',
72
+ name: 'name',
73
+ type: 'input'
74
+ },
75
+ {
76
+ label: '性别',
77
+ name: 'sex',
78
+ type: 'select',
79
+ options: SEX_OPTION
80
+ },
81
+ {
82
+ label: '日期范围',
83
+ name: ['startTime', 'endTime'],
84
+ type: 'date-picker',
85
+ props: {
86
+ type: 'daterange'
87
+ }
88
+ }
89
+ ]
90
+ }
91
+ }
92
+ }
93
+ </script>
94
+ ```
95
+ :::
96
+
97
+
98
+ ## 支持插槽类型
99
+
100
+ ::: demo
101
+ ```html
102
+ <template>
103
+ <iov-pro-space space="12px">
104
+ <iov-pro-form
105
+ v-model="formData"
106
+ :items="ITEMS"
107
+ >
108
+ <template #time-unit>
109
+ <el-input
110
+ v-model="formData.time"
111
+ placeholder="请输入抽烟时长"
112
+ clearable
113
+ >
114
+ <el-select
115
+ v-model="formData.unit"
116
+ slot="append"
117
+ placeholder="请选择单位"
118
+ >
119
+ <el-option label="年" value="year" />
120
+ <el-option label="月" value="month" />
121
+ <el-option label="日" value="day" />
122
+ </el-select>
123
+ </el-input>
124
+ </template>
125
+ </iov-pro-form>
126
+ <div style="font-size: 12px;font-weight: bold;">当前表单数据: {{ formData }}</div>
127
+ </iov-pro-space>
128
+ </template>
129
+
130
+ <script>
131
+ export default {
132
+ data() {
133
+ const SEX_OPTION = [
134
+ { label: '男', value: 1 },
135
+ { label: '女', value: 0 }
136
+ ]
137
+
138
+ return {
139
+ formData: {},
140
+ ITEMS: [
141
+ {
142
+ label: '姓名',
143
+ name: 'name',
144
+ type: 'input'
145
+ },
146
+ {
147
+ label: '性别',
148
+ name: 'sex',
149
+ type: 'select',
150
+ options: SEX_OPTION
151
+ },
152
+ {
153
+ label: '学习时长',
154
+ name: ['time', 'unit'],
155
+ type: 'slot',
156
+ slotName: 'time-unit',
157
+ value: ['', 'year'],
158
+ rules: {
159
+ required: true,
160
+ validator(rule, value, callback) {
161
+ if (!value[0]) {
162
+ callback(new Error('请输入学习时长'))
163
+ } else {
164
+ callback()
165
+ }
166
+ }
167
+ }
168
+ }
169
+ ]
170
+ }
171
+ }
172
+ }
173
+ </script>
174
+ ```
175
+ :::
176
+
177
+ ## 表单项插槽
178
+
179
+ ::: demo
180
+ ```html
181
+ <template>
182
+ <iov-pro-space space="12px">
183
+ <iov-pro-form
184
+ v-model="formData"
185
+ :items="ITEMS"
186
+ >
187
+ <template #name-label-slot>
188
+ 姓名 <span style="color: red; font-size: 12px; margin-left: 8px;">请输入真实姓名</span>
189
+ </template>
190
+ <template #name-prepend-slot>重要</template>
191
+ </iov-pro-form>
192
+ </iov-pro-space>
193
+ </template>
194
+
195
+ <script>
196
+ export default {
197
+ data() {
198
+ const SEX_OPTION = [
199
+ { label: '男', value: 1 },
200
+ { label: '女', value: 0 }
201
+ ]
202
+
203
+ return {
204
+ formData: {},
205
+ ITEMS: [
206
+ {
207
+ label: '姓名',
208
+ name: 'name',
209
+ type: 'input',
210
+ slots: {
211
+ formItem: {
212
+ label: 'name-label-slot'
213
+ },
214
+ component: {
215
+ prepend: 'name-prepend-slot'
216
+ }
217
+ }
218
+ },
219
+ {
220
+ label: '性别',
221
+ name: 'sex',
222
+ type: 'select',
223
+ options: SEX_OPTION
224
+ }
225
+ ]
226
+ }
227
+ }
228
+ }
229
+ </script>
230
+ ```
231
+ :::
232
+
233
+ ## 加载下拉数据
234
+ `options` 字段支持 直接赋值 ,函数返回,以及 `Promise` 回调方式。但是数据格式仅支持 `label` ,`value` 形式,如果接口返回非此形式,需要在 `options` 方法中自行转换。
235
+
236
+ ::: demo
237
+ ```html
238
+ <template>
239
+ <iov-pro-form
240
+ ref="form"
241
+ v-model="formData"
242
+ :items="ITEMS"
243
+ />
244
+ </template>
245
+
246
+ <script>
247
+ const apiMock = () => {
248
+ return new Promise((resolve, reject) => {
249
+ setTimeout(() => {
250
+ resolve([
251
+ {
252
+ label: '江苏省',
253
+ value: 'jiangsu',
254
+ children: [
255
+ { label: '南京市', value: 'nanjing' },
256
+ { label: '苏州市', value: '苏州' }
257
+ ]
258
+ },
259
+ {
260
+ label: '安徽省',
261
+ value: 'anhui',
262
+ children: [
263
+ { label: '合肥市', value: 'hefei' },
264
+ { label: '芜湖', value: 'wuhu' }
265
+ ]
266
+ }
267
+ ])
268
+ }, 300)
269
+ })
270
+ }
271
+
272
+ export default {
273
+ data() {
274
+ const SEX_OPTION = [
275
+ { label: '男', value: 1 },
276
+ { label: '女', value: 0 }
277
+ ]
278
+
279
+ const MAN_LINK = [
280
+ { label: '篮球', value: 1 },
281
+ { label: '足球', value: 2 }
282
+ ]
283
+
284
+ const WOMEN_LINK = [
285
+ { label: '羽毛球', value: 3 },
286
+ { label: '乒乓球', value: 4 }
287
+ ]
288
+
289
+ return {
290
+ formData: {},
291
+ ITEMS: [
292
+ {
293
+ label: '姓名',
294
+ name: 'name',
295
+ type: 'input'
296
+ },
297
+ {
298
+ label: '性别',
299
+ name: 'sex',
300
+ type: 'select',
301
+ options: SEX_OPTION
302
+ },
303
+ {
304
+ label: '爱好',
305
+ name: 'favorite',
306
+ type: 'select',
307
+ watch: ['sex'],
308
+ options({ sex }) {
309
+ return sex === 1 ? MAN_LINK : WOMEN_LINK
310
+ }
311
+ },
312
+ {
313
+ label: '籍贯',
314
+ name: 'location',
315
+ type: 'cascader',
316
+ async options() {
317
+ const list = await apiMock()
318
+ return list
319
+ }
320
+ }
321
+ ]
322
+ }
323
+ }
324
+ }
325
+ </script>
326
+ ```
327
+ :::
328
+
329
+
330
+ ## 数据校验
331
+
332
+ ::: demo
333
+ ```html
334
+ <template>
335
+ <div class="iov-pro-form-demo">
336
+ <iov-pro-form
337
+ ref="form"
338
+ v-model="formData"
339
+ :items="ITEMS"
340
+ />
341
+ <div style="margin-top: 12px; text-align: center;">
342
+ <el-button round @click="onClearValidate">清除校验</el-button>
343
+ <el-button type="primary" round @click="onValidate">校验</el-button>
344
+ </div>
345
+ </div>
346
+ </template>
347
+
348
+ <script>
349
+ export default {
350
+ data() {
351
+ const SEX_OPTION = [
352
+ { label: '男', value: 1 },
353
+ { label: '女', value: 0 }
354
+ ]
355
+
356
+ return {
357
+ formData: {},
358
+ ITEMS: [
359
+ {
360
+ label: '姓名',
361
+ name: 'name',
362
+ type: 'input',
363
+ rules: { required: true, message: '请输入姓名', trigger: ['change', 'blur'] }
364
+ },
365
+ {
366
+ label: '性别',
367
+ name: 'sex',
368
+ type: 'select',
369
+ options: SEX_OPTION,
370
+ rules: { required: true, message: '请选择性别', trigger: 'change' }
371
+ }
372
+ ]
373
+ }
374
+ },
375
+ methods: {
376
+ /**
377
+ * 清除校验
378
+ */
379
+ onClearValidate() {
380
+ this.$refs.form.clearValidate()
381
+ },
382
+
383
+ /**
384
+ * 触发校验
385
+ */
386
+ async onValidate() {
387
+ await this.$refs.form.validate()
388
+ }
389
+ }
390
+ }
391
+ </script>
392
+ ```
393
+ :::
394
+
395
+ ## 栅格系统
396
+
397
+ ::: demo
398
+ ```html
399
+ <template>
400
+ <iov-pro-form
401
+ v-model="formData"
402
+ :items="ITEMS"
403
+ :config="{ grid: true, gutter: 12, labelWidth: '40px' }"
404
+ />
405
+ </template>
406
+
407
+ <script>
408
+ export default {
409
+ data() {
410
+ const SEX_OPTION = [
411
+ { label: '男', value: 1 },
412
+ { label: '女', value: 0 }
413
+ ]
414
+
415
+ const BOOL_VALUE = [
416
+ { label: '是', value: true },
417
+ { label: '否', value: false }
418
+ ]
419
+
420
+ return {
421
+ formData: {},
422
+ ITEMS: [
423
+ {
424
+ label: '姓名',
425
+ name: 'name',
426
+ type: 'input',
427
+ span: 12
428
+ },
429
+ {
430
+ label: '性别',
431
+ name: 'sex',
432
+ type: 'select',
433
+ span: 12,
434
+ options: SEX_OPTION
435
+ },
436
+ {
437
+ label: '最喜欢的体育运动',
438
+ vif: ({ sex }) => sex === 1,
439
+ name: 'sport',
440
+ type: 'input',
441
+ labelWidth: '120px',
442
+ span: 12
443
+ }
444
+ ]
445
+ }
446
+ }
447
+ }
448
+ </script>
449
+ ```
450
+ :::
451
+
452
+
453
+ ## 有条件显示
454
+
455
+ ::: demo
456
+ ```html
457
+ <template>
458
+ <iov-pro-form
459
+ v-model="formData"
460
+ :items="ITEMS"
461
+ />
462
+ </template>
463
+
464
+ <script>
465
+ export default {
466
+ data() {
467
+ const SEX_OPTION = [
468
+ { label: '男', value: 1 },
469
+ { label: '女', value: 0 }
470
+ ]
471
+
472
+ const BOOL_VALUE = [
473
+ { label: '是', value: true },
474
+ { label: '否', value: false }
475
+ ]
476
+
477
+ return {
478
+ formData: {},
479
+ ITEMS: [
480
+ { label: '姓名', name: 'name', type: 'input' },
481
+ { label: '性别', name: 'sex', type: 'select', options: SEX_OPTION },
482
+ { label: '最喜欢的体育运动', vif: ({ sex }) => sex === 1, name: 'sport', type: 'input' }
483
+ ]
484
+ }
485
+ }
486
+ }
487
+ </script>
488
+ ```
489
+ :::
490
+
491
+
492
+ ## 监听字段变化
493
+
494
+ ::: demo
495
+ ```html
496
+ <template>
497
+ <iov-pro-form
498
+ v-model="formData"
499
+ :items="ITEMS"
500
+ />
501
+ </template>
502
+
503
+ <script>
504
+ export default {
505
+ data() {
506
+ const SEX_OPTION = [
507
+ { label: '男', value: 1 },
508
+ { label: '女', value: 0 }
509
+ ]
510
+
511
+ const MAN_LINK = [
512
+ { label: '篮球', value: 1 },
513
+ { label: '足球', value: 2 }
514
+ ]
515
+
516
+ const WOMEN_LINK = [
517
+ { label: '羽毛球', value: 3 },
518
+ { label: '乒乓球', value: 4 }
519
+ ]
520
+
521
+ return {
522
+ formData: {},
523
+ ITEMS: [
524
+ {
525
+ label: '姓名',
526
+ name: 'name',
527
+ type: 'input'
528
+ },
529
+ {
530
+ label: '性别',
531
+ name: 'sex',
532
+ type: 'select',
533
+ options: SEX_OPTION
534
+ },
535
+ {
536
+ label: '爱好',
537
+ watch: ['sex'],
538
+ name: 'like',
539
+ type: 'select',
540
+ options: ({ sex }) => sex === 1 ? MAN_LINK : WOMEN_LINK
541
+ }
542
+ ]
543
+ }
544
+ }
545
+ }
546
+ </script>
547
+ ```
548
+ :::
549
+
550
+
551
+ ## 监听外部字段变化
552
+
553
+ ::: demo
554
+ ```html
555
+ <template>
556
+ <div class="iov-pro-form-demo">
557
+ <iov-pro-space space="12px">
558
+ <div>
559
+ <iov-pro-sub-title name="外部数据源" />
560
+ <el-select v-model="dataSource.range" placeholder="请选择年龄范围">
561
+ <el-option label="低于35岁" :value="true" />
562
+ <el-option label="高于35岁" :value="false" />
563
+ </el-select>
564
+ </div>
565
+ <div>
566
+ <iov-pro-sub-title name="表单" />
567
+ <iov-pro-form
568
+ v-model="formData"
569
+ :data-source="dataSource"
570
+ :items="ITEMS"
571
+ />
572
+ </div>
573
+ </iov-pro-space>
574
+ </div>
575
+ </template>
576
+
577
+ <script>
578
+ export default {
579
+ data() {
580
+ const SEX_OPTION = [
581
+ { label: '男', value: 1 },
582
+ { label: '女', value: 0 }
583
+ ]
584
+
585
+ const MAN_LINK = [
586
+ { label: '篮球', value: 1 },
587
+ { label: '足球', value: 2 }
588
+ ]
589
+
590
+ const WOMEN_LINK = [
591
+ { label: '羽毛球', value: 3 },
592
+ { label: '乒乓球', value: 4 }
593
+ ]
594
+
595
+ return {
596
+ formData: {},
597
+ dataSource: { range: false },
598
+ ITEMS: [
599
+ {
600
+ label: '姓名',
601
+ name: 'name',
602
+ type: 'input'
603
+ },
604
+ {
605
+ label: '性别',
606
+ name: 'sex',
607
+ type: 'select',
608
+ options: SEX_OPTION
609
+ },
610
+ {
611
+ label: '爱好',
612
+ watch: ['sex', 'dataSource.range'],
613
+ name: 'like',
614
+ type: 'select',
615
+ options: {
616
+ handler({ sex }, dataSource) {
617
+ if (!dataSource.range) {
618
+ return [
619
+ { label: '钓鱼', value: 5 },
620
+ { label: '广场舞', value: 6 }
621
+ ]
622
+ }
623
+ return [0, 1].includes(sex) ? [WOMEN_LINK, MAN_LINK][sex] : []
624
+ },
625
+ inject: ['dataSource']
626
+ }
627
+ }
628
+ ]
629
+ }
630
+ }
631
+ }
632
+ </script>
633
+ ```
634
+ :::
635
+
636
+
637
+ ## 动态Props
638
+ 当组件的状态(比如:`disabled` )需要根据表单字段中值来控制,则可以使用动态 `Props` 来实现目的。
639
+
640
+ ::: demo
641
+ ```html
642
+ <template>
643
+ <iov-pro-form
644
+ v-model="formData"
645
+ :items="ITEMS"
646
+ />
647
+ </template>
648
+
649
+ <script>
650
+ export default {
651
+ data() {
652
+ const SEX_OPTION = [
653
+ { label: '男', value: 1 },
654
+ { label: '女', value: 0 }
655
+ ]
656
+
657
+ const WOMEN_LINK = [
658
+ { label: '羽毛球', value: 3 },
659
+ { label: '乒乓球', value: 4 }
660
+ ]
661
+
662
+ return {
663
+ formData: {},
664
+ ITEMS: [
665
+ {
666
+ label: '姓名',
667
+ name: 'name',
668
+ type: 'input'
669
+ },
670
+ {
671
+ label: '性别',
672
+ name: 'sex',
673
+ type: 'select',
674
+ options: SEX_OPTION,
675
+ props: {
676
+ placeholder: '请选择对应的性别',
677
+ clearable: true
678
+ }
679
+ },
680
+ {
681
+ label: '爱好',
682
+ name: 'like',
683
+ type: 'select',
684
+ options: WOMEN_LINK,
685
+ props: ({ sex }) => ({ disabled: sex === 1 })
686
+ }
687
+ ]
688
+ }
689
+ }
690
+ }
691
+ </script>
692
+ ```
693
+ :::
694
+
695
+ ## 事件监听
696
+
697
+ ::: demo
698
+ ```html
699
+ <template>
700
+ <iov-pro-form
701
+ v-model="formData"
702
+ :items="ITEMS"
703
+ />
704
+ </template>
705
+
706
+ <script>
707
+ export default {
708
+ data() {
709
+ const SEX_OPTION = [
710
+ { label: '男', value: 1 },
711
+ { label: '女', value: 0 }
712
+ ]
713
+
714
+ const WOMEN_LINK = [
715
+ { label: '羽毛球', value: 3 },
716
+ { label: '乒乓球', value: 4 }
717
+ ]
718
+
719
+ return {
720
+ formData: {},
721
+ ITEMS: [
722
+ {
723
+ label: '姓名',
724
+ name: 'name',
725
+ type: 'input',
726
+ on: {
727
+ /**
728
+ * 输入事件
729
+ */
730
+ input(val) {
731
+ alert('当前输入的是:' + val)
732
+ }
733
+ }
734
+ },
735
+ {
736
+ label: '性别',
737
+ name: 'sex',
738
+ type: 'select',
739
+ options: SEX_OPTION,
740
+ props: {
741
+ placeholder: '请选择对应的性别',
742
+ clearable: true
743
+ },
744
+ on: {
745
+ /**
746
+ * 改变事件
747
+ */
748
+ change(val) {
749
+ alert('当前选中的是:' + (val === 1 ? '男' : '女'))
750
+ }
751
+ }
752
+ }
753
+ ]
754
+ }
755
+ }
756
+ }
757
+ </script>
758
+ ```
759
+ :::
760
+
761
+ ## 参数注入
762
+ 如果当前需要获取完整表单数据,或者外部数据源数据,或者需要获取表单上下文 `this` 实例或者当前页面上下文 `this` 实例,进行函数调用。则需要注入参数到函数中。可注入的对象有:表单数据(`model`),外部数据源(`dataSource`),表单上下文(`formThis`)以及页面上下文 `this`(`pageThis`)。其中页面上下文需要通过provide方式传递给表单组件,否则,表单组件认为父组件即为页面。
763
+ ::: demo
764
+ ```html
765
+ <template>
766
+ <iov-pro-form
767
+ v-model="formData"
768
+ :items="ITEMS"
769
+ />
770
+ </template>
771
+
772
+ <script>
773
+ export default {
774
+ data() {
775
+ const SEX_OPTION = [
776
+ { label: '男', value: 1 },
777
+ { label: '女', value: 0 }
778
+ ]
779
+
780
+ const WOMEN_LINK = [
781
+ { label: '羽毛球', value: 3 },
782
+ { label: '乒乓球', value: 4 }
783
+ ]
784
+
785
+ return {
786
+ formData: {},
787
+ ITEMS: [
788
+ {
789
+ label: '姓名',
790
+ name: 'name',
791
+ type: 'input',
792
+ props: {
793
+ disabled: true
794
+ }
795
+ },
796
+ {
797
+ label: '性别',
798
+ name: 'sex',
799
+ type: 'select',
800
+ options: SEX_OPTION,
801
+ props: {
802
+ placeholder: '请选择对应的性别',
803
+ clearable: true
804
+ },
805
+ on: {
806
+ /**
807
+ * 改变事件
808
+ */
809
+ change: {
810
+ handler(val, pageThis, model) {
811
+ if (val === 1) {
812
+ pageThis.$set(model, 'name', '郭靖')
813
+ } else if (val === 0) {
814
+ pageThis.$set(model, 'name', '黄蓉')
815
+ } else {
816
+ pageThis.$set(model, 'name', '')
817
+ }
818
+ pageThis.onConsoleData('当前表单数据为: ' + JSON.stringify(model))
819
+ },
820
+ inject: ['pageThis', 'model']
821
+ }
822
+ }
823
+ }
824
+ ]
825
+ }
826
+ },
827
+ provide() {
828
+ return {
829
+ pageThis: this
830
+ }
831
+ },
832
+ methods: {
833
+ /**
834
+ * 打印data数据
835
+ */
836
+ onConsoleData(message) {
837
+ this.$message.info(message)
838
+ }
839
+ }
840
+ }
841
+ </script>
842
+ ```
843
+ :::
844
+
845
+
846
+ ## 使用全局自定义指令
847
+ 使用 `directive` 字段可以使用全局自定义指令,或者 `v-model` 指令的修饰符。其中 `v-model` 指令的修饰符需要传递字符串,例如:`model.trim`, `model.number` 。但是自定义指令需要 `{ name: '指令名称', value: '指令值' }` 格式的数据。如果需要插入多个指令,请传递数组形式。
848
+ ::: demo
849
+ ```html
850
+ <template>
851
+ <iov-pro-form
852
+ v-model="formData"
853
+ :items="ITEMS"
854
+ />
855
+ </template>
856
+
857
+ <script>
858
+ export default {
859
+ data() {
860
+ const SEX_OPTION = [
861
+ { label: '男', value: 1 },
862
+ { label: '女', value: 0 }
863
+ ]
864
+
865
+ const WOMEN_LINK = [
866
+ { label: '羽毛球', value: 3 },
867
+ { label: '乒乓球', value: 4 }
868
+ ]
869
+
870
+ return {
871
+ formData: {},
872
+ ITEMS: [
873
+ {
874
+ label: '姓名',
875
+ name: 'name',
876
+ type: 'input',
877
+ directive: 'model.trim'
878
+ },
879
+ {
880
+ label: '年龄',
881
+ name: 'age',
882
+ type: 'input',
883
+ directive: [
884
+ 'model.trim',
885
+ { name: 'number', value: 2 }
886
+ ]
887
+ },
888
+ {
889
+ label: '家庭存款',
890
+ name: 'money',
891
+ type: 'input',
892
+ directive: { name: 'number', value: 2 }
893
+ },
894
+ {
895
+ label: '性别',
896
+ name: 'sex',
897
+ type: 'select',
898
+ options: SEX_OPTION,
899
+ props: {
900
+ placeholder: '请选择对应的性别',
901
+ clearable: true
902
+ }
903
+ }
904
+ ]
905
+ }
906
+ }
907
+ }
908
+ </script>
909
+ ```
910
+ :::
911
+
912
+
913
+ ## Attributes
914
+
915
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
916
+ | ------- | ------- | ------- | ------- | ------- |
917
+ | value | 双向绑定的数据 | Object | - | - |
918
+ | items | 描述项配置,详见下方 Items 配置 | Array | - | - |
919
+ | dataSource | 外部数据源,用于items配置中需要监听的表单外数据 | Object | - | - |
920
+ | config | 表单配置 | Object | - | - |
921
+
922
+ ## Config Attributes
923
+
924
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
925
+ | ------- | ------- | ------- | ------- | ------- |
926
+ | grid | 是否需要栅格系统 | Boolean | - | - |
927
+ | span | 表单项兜底的栅格的数值,可被表单项栅格配置覆盖 | Number | - | - |
928
+ | gutter | 栅格之间间隔 | Number | - | - |
929
+ | size | 表单输入组件尺寸 | String | medium/small/mini | - |
930
+ | labelPosition | 描述项位置 | String | left/right/top | - |
931
+ | labelWidth | 描述项文案宽度 | Number/String | - | - |
932
+ | disabled | 是否禁用该表单内的所有组件 | Boolean | - | false |
933
+ | inline | 行内表单模式 | Boolean | - | false |
934
+
935
+ ## Items Attributes
936
+
937
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
938
+ | ------- | ------- | ------- | ------- | ------- |
939
+ | type | 当前使用控件类型,支持自定义组件 | String/vnode | slot/select/input/cascader/date-picker/radio/checkbox等 | - |
940
+ | label | 描述项文案 | String | - | - |
941
+ | labelWidth | 描述项文案宽度 | Number/String | - | - |
942
+ | name | 当前字段名。如果类型为数组,则将数据解构成数组字段 | String/Array | - | - |
943
+ | props | 需要传递给输入组件的属性配置,详见组件库的输入组件入参 | Object/Function | - | - |
944
+ | span | 当前栅格的数值 | Number | 1-24 | 6 |
945
+ | vif | 设置字段是否需要展示 | Boolean/Function | - | - |
946
+ | rules | 设置当前表单项的校验规则 | Object/Array | - | - |
947
+ | directive | 给组件绑定自定义指令 | String/Object/Array | - | - |
948
+ | size | 当前输入组件的尺寸 | String | medium/small/mini | - |
949
+ | options | 输入组件获取的options数据 | Array/Function/Promise | - | - |
950
+
951
+ ## Form Methods
952
+
953
+ | 方法名 | 说明 | 参数 |
954
+ | ------- | ------- | ------- |
955
+ | validate | 对整个表单进行校验的方法,返回一个 promise | - |
956
+ | clearValidate | 移除表单项的校验结果。传入待移除的表单项的 prop 属性或者 prop 组成的数组,如不传则移除整个表单的校验结果 | Function(props: Array/string) |
957
+ | resetFields | 对整个表单进行重置,将所有字段值重置为初始值并移除校验结果 | - |
958
+ | getOptions | 获取指定字段的下拉数据 | Function(props: Array/string) |