Commit a5ff59237f2eb6ea4c1770acc594c75bf1f6e95f

Authored by 无木
1 parent 65735926

feat(form): component `Divider` support `helpMessage`

Divider表单组件支持helpMessage配置
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: () => {