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 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: () => {
... ...