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,14 +306,14 @@ | ||
306 | } | 306 | } |
307 | 307 | ||
308 | function renderItem() { | 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 | const { labelCol, wrapperCol } = unref(itemLabelWidthProp); | 310 | const { labelCol, wrapperCol } = unref(itemLabelWidthProp); |
311 | const { colon } = props.formProps; | 311 | const { colon } = props.formProps; |
312 | 312 | ||
313 | if (component === 'Divider') { | 313 | if (component === 'Divider') { |
314 | return ( | 314 | return ( |
315 | <Col span={24}> | 315 | <Col span={24}> |
316 | - <Divider {...unref(getComponentsProps)}>{label}</Divider> | 316 | + <Divider {...unref(getComponentsProps)}>{renderLabelHelpMessage()}</Divider> |
317 | </Col> | 317 | </Col> |
318 | ); | 318 | ); |
319 | } else { | 319 | } else { |
src/views/demo/form/index.vue
@@ -9,6 +9,24 @@ | @@ -9,6 +9,24 @@ | ||
9 | @submit="handleSubmit" | 9 | @submit="handleSubmit" |
10 | @reset="handleReset" | 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 | <template #localSearch="{ model, field }"> | 30 | <template #localSearch="{ model, field }"> |
13 | <ApiSelect | 31 | <ApiSelect |
14 | :api="optionsListApi" | 32 | :api="optionsListApi" |
@@ -47,6 +65,26 @@ | @@ -47,6 +65,26 @@ | ||
47 | import { optionsListApi } from '/@/api/demo/select'; | 65 | import { optionsListApi } from '/@/api/demo/select'; |
48 | import { useDebounceFn } from '@vueuse/core'; | 66 | import { useDebounceFn } from '@vueuse/core'; |
49 | import { treeOptionsListApi } from '/@/api/demo/tree'; | 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 | const provincesOptions = [ | 89 | const provincesOptions = [ |
52 | { | 90 | { |
@@ -101,7 +139,7 @@ | @@ -101,7 +139,7 @@ | ||
101 | 139 | ||
102 | const schemas: FormSchema[] = [ | 140 | const schemas: FormSchema[] = [ |
103 | { | 141 | { |
104 | - field: '', | 142 | + field: 'divider-basic', |
105 | component: 'Divider', | 143 | component: 'Divider', |
106 | label: '基础字段', | 144 | label: '基础字段', |
107 | }, | 145 | }, |
@@ -299,7 +337,7 @@ | @@ -299,7 +337,7 @@ | ||
299 | }, | 337 | }, |
300 | }, | 338 | }, |
301 | { | 339 | { |
302 | - field: '', | 340 | + field: 'divider-api-select', |
303 | component: 'Divider', | 341 | component: 'Divider', |
304 | label: '远程下拉演示', | 342 | label: '远程下拉演示', |
305 | }, | 343 | }, |
@@ -373,18 +411,9 @@ | @@ -373,18 +411,9 @@ | ||
373 | }, | 411 | }, |
374 | }, | 412 | }, |
375 | { | 413 | { |
376 | - field: '', | 414 | + field: 'divider-linked', |
377 | component: 'Divider', | 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 | field: 'province', | 419 | field: 'province', |
@@ -432,6 +461,46 @@ | @@ -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 | field: 'field21', | 504 | field: 'field21', |
436 | component: 'Slider', | 505 | component: 'Slider', |
437 | label: '字段21', | 506 | label: '字段21', |
@@ -464,7 +533,7 @@ | @@ -464,7 +533,7 @@ | ||
464 | ]; | 533 | ]; |
465 | 534 | ||
466 | export default defineComponent({ | 535 | export default defineComponent({ |
467 | - components: { BasicForm, CollapseContainer, PageWrapper, ApiSelect }, | 536 | + components: { BasicForm, CollapseContainer, PageWrapper, ApiSelect, ASelect: Select }, |
468 | setup() { | 537 | setup() { |
469 | const check = ref(null); | 538 | const check = ref(null); |
470 | const { createMessage } = useMessage(); | 539 | const { createMessage } = useMessage(); |
@@ -479,6 +548,10 @@ | @@ -479,6 +548,10 @@ | ||
479 | return { | 548 | return { |
480 | schemas, | 549 | schemas, |
481 | optionsListApi, | 550 | optionsListApi, |
551 | + optionsA, | ||
552 | + optionsB, | ||
553 | + valueSelectA, | ||
554 | + valueSelectB, | ||
482 | onSearch: useDebounceFn(onSearch, 300), | 555 | onSearch: useDebounceFn(onSearch, 300), |
483 | searchParams, | 556 | searchParams, |
484 | handleReset: () => { | 557 | handleReset: () => { |