Commit a5ff59237f2eb6ea4c1770acc594c75bf1f6e95f
1 parent
65735926
feat(form): component `Divider` support `helpMessage`
Divider表单组件支持helpMessage配置
Showing
2 changed files
with
89 additions
and
16 deletions
src/components/Form/src/components/FormItem.vue
... | ... | @@ -306,14 +306,14 @@ |
306 | 306 | } |
307 | 307 | |
308 | 308 | function renderItem() { |
309 | - const { itemProps, slot, render, field, suffix, component, label } = props.schema; | |
309 | + const { itemProps, slot, render, field, suffix, component } = props.schema; | |
310 | 310 | const { labelCol, wrapperCol } = unref(itemLabelWidthProp); |
311 | 311 | const { colon } = props.formProps; |
312 | 312 | |
313 | 313 | if (component === 'Divider') { |
314 | 314 | return ( |
315 | 315 | <Col span={24}> |
316 | - <Divider {...unref(getComponentsProps)}>{label}</Divider> | |
316 | + <Divider {...unref(getComponentsProps)}>{renderLabelHelpMessage()}</Divider> | |
317 | 317 | </Col> |
318 | 318 | ); |
319 | 319 | } else { | ... | ... |
src/views/demo/form/index.vue
... | ... | @@ -9,6 +9,24 @@ |
9 | 9 | @submit="handleSubmit" |
10 | 10 | @reset="handleReset" |
11 | 11 | > |
12 | + <template #selectA="{ model, field }"> | |
13 | + <a-select | |
14 | + :options="optionsA" | |
15 | + mode="multiple" | |
16 | + v-model:value="model[field]" | |
17 | + @change="valueSelectA = model[field]" | |
18 | + allowClear | |
19 | + /> | |
20 | + </template> | |
21 | + <template #selectB="{ model, field }"> | |
22 | + <a-select | |
23 | + :options="optionsB" | |
24 | + mode="multiple" | |
25 | + v-model:value="model[field]" | |
26 | + @change="valueSelectB = model[field]" | |
27 | + allowClear | |
28 | + /> | |
29 | + </template> | |
12 | 30 | <template #localSearch="{ model, field }"> |
13 | 31 | <ApiSelect |
14 | 32 | :api="optionsListApi" |
... | ... | @@ -47,6 +65,26 @@ |
47 | 65 | import { optionsListApi } from '/@/api/demo/select'; |
48 | 66 | import { useDebounceFn } from '@vueuse/core'; |
49 | 67 | import { treeOptionsListApi } from '/@/api/demo/tree'; |
68 | + import { Select } from 'ant-design-vue'; | |
69 | + import { cloneDeep } from 'lodash-es'; | |
70 | + | |
71 | + const valueSelectA = ref<string[]>([]); | |
72 | + const valueSelectB = ref<string[]>([]); | |
73 | + const options = ref<Recordable[]>([]); | |
74 | + for (let i = 1; i < 10; i++) options.value.push({ label: '选项' + i, value: `${i}` }); | |
75 | + | |
76 | + const optionsA = computed(() => { | |
77 | + return cloneDeep(unref(options)).map((op) => { | |
78 | + op.disabled = unref(valueSelectB).indexOf(op.value) !== -1; | |
79 | + return op; | |
80 | + }); | |
81 | + }); | |
82 | + const optionsB = computed(() => { | |
83 | + return cloneDeep(unref(options)).map((op) => { | |
84 | + op.disabled = unref(valueSelectA).indexOf(op.value) !== -1; | |
85 | + return op; | |
86 | + }); | |
87 | + }); | |
50 | 88 | |
51 | 89 | const provincesOptions = [ |
52 | 90 | { |
... | ... | @@ -101,7 +139,7 @@ |
101 | 139 | |
102 | 140 | const schemas: FormSchema[] = [ |
103 | 141 | { |
104 | - field: '', | |
142 | + field: 'divider-basic', | |
105 | 143 | component: 'Divider', |
106 | 144 | label: '基础字段', |
107 | 145 | }, |
... | ... | @@ -299,7 +337,7 @@ |
299 | 337 | }, |
300 | 338 | }, |
301 | 339 | { |
302 | - field: '', | |
340 | + field: 'divider-api-select', | |
303 | 341 | component: 'Divider', |
304 | 342 | label: '远程下拉演示', |
305 | 343 | }, |
... | ... | @@ -373,18 +411,9 @@ |
373 | 411 | }, |
374 | 412 | }, |
375 | 413 | { |
376 | - field: '', | |
414 | + field: 'divider-linked', | |
377 | 415 | component: 'Divider', |
378 | - label: '其它', | |
379 | - }, | |
380 | - { | |
381 | - field: 'field20', | |
382 | - component: 'InputNumber', | |
383 | - label: '字段20', | |
384 | - required: true, | |
385 | - colProps: { | |
386 | - span: 8, | |
387 | - }, | |
416 | + label: '字段联动', | |
388 | 417 | }, |
389 | 418 | { |
390 | 419 | field: 'province', |
... | ... | @@ -432,6 +461,46 @@ |
432 | 461 | }, |
433 | 462 | }, |
434 | 463 | { |
464 | + field: 'divider-selects', | |
465 | + component: 'Divider', | |
466 | + label: '互斥多选', | |
467 | + helpMessage: ['两个Select共用数据源', '但不可选择对方已选中的项目'], | |
468 | + }, | |
469 | + { | |
470 | + field: 'selectA', | |
471 | + component: 'Select', | |
472 | + label: '互斥SelectA', | |
473 | + slot: 'selectA', | |
474 | + defaultValue: [], | |
475 | + colProps: { | |
476 | + span: 8, | |
477 | + }, | |
478 | + }, | |
479 | + { | |
480 | + field: 'selectB', | |
481 | + component: 'Select', | |
482 | + label: '互斥SelectB', | |
483 | + slot: 'selectB', | |
484 | + defaultValue: [], | |
485 | + colProps: { | |
486 | + span: 8, | |
487 | + }, | |
488 | + }, | |
489 | + { | |
490 | + field: 'divider-others', | |
491 | + component: 'Divider', | |
492 | + label: '其它', | |
493 | + }, | |
494 | + { | |
495 | + field: 'field20', | |
496 | + component: 'InputNumber', | |
497 | + label: '字段20', | |
498 | + required: true, | |
499 | + colProps: { | |
500 | + span: 8, | |
501 | + }, | |
502 | + }, | |
503 | + { | |
435 | 504 | field: 'field21', |
436 | 505 | component: 'Slider', |
437 | 506 | label: '字段21', |
... | ... | @@ -464,7 +533,7 @@ |
464 | 533 | ]; |
465 | 534 | |
466 | 535 | export default defineComponent({ |
467 | - components: { BasicForm, CollapseContainer, PageWrapper, ApiSelect }, | |
536 | + components: { BasicForm, CollapseContainer, PageWrapper, ApiSelect, ASelect: Select }, | |
468 | 537 | setup() { |
469 | 538 | const check = ref(null); |
470 | 539 | const { createMessage } = useMessage(); |
... | ... | @@ -479,6 +548,10 @@ |
479 | 548 | return { |
480 | 549 | schemas, |
481 | 550 | optionsListApi, |
551 | + optionsA, | |
552 | + optionsB, | |
553 | + valueSelectA, | |
554 | + valueSelectB, | |
482 | 555 | onSearch: useDebounceFn(onSearch, 300), |
483 | 556 | searchParams, |
484 | 557 | handleReset: () => { | ... | ... |