Ben Lin
2024-06-20 de7e6c408b6209158b08991d729c4bcc72055eec
src/views/demo/form/AppendForm.vue
@@ -1,133 +1,203 @@
<template>
  <PageWrapper title="表单增删示例">
    <CollapseContainer title="表单增删">
    <CollapseContainer title="表单项增删">
      <BasicForm @register="register" @submit="handleSubmit">
        <template #add="{ field }">
          <Button v-if="Number(field) === 0" @click="add">+</Button>
          <Button class="ml-2" v-if="Number(field) === 0" @click="batchAdd">
          <a-button v-if="Number(field) === 0" @click="add">+</a-button>
          <a-button class="ml-2" v-if="Number(field) === 0" @click="batchAdd">
            批量添加表单配置
          </Button>
          <Button v-if="field > 0" @click="del(field)">-</Button>
          </a-button>
          <a-button v-if="Number(field) > 0" @click="() => del(field)">-</a-button>
        </template>
      </BasicForm>
    </CollapseContainer>
    <CollapseContainer title="表单组增删" class="my-3">
      <a-button @click="setGroup">设置初始值</a-button>
      <a-button class="m-2" @click="addGroup"> 批量添加表单 </a-button>
      <a-button @click="delGroup">批量减少表单</a-button>
      <BasicForm @register="registerGroup" @submit="handleSubmitGroup" />
    </CollapseContainer>
  </PageWrapper>
</template>
<script lang="ts">
  import { defineComponent, ref } from 'vue';
  import { BasicForm, useForm } from '/@/components/Form/index';
  import { CollapseContainer } from '/@/components/Container';
  import { Input } from 'ant-design-vue';
  import { PageWrapper } from '/@/components/Page';
  import { Button } from '/@/components/Button';
<script lang="ts" setup>
  import { ref } from 'vue';
  import { BasicForm, useForm } from '@/components/Form';
  import { CollapseContainer } from '@/components/Container';
  import { PageWrapper } from '@/components/Page';
  export default defineComponent({
    components: { BasicForm, CollapseContainer, PageWrapper, [Input.name]: Input, Button },
    setup() {
      const [register, { appendSchemaByField, removeSchemaByField, validate }] = useForm({
        schemas: [
          {
            field: 'field0a',
            component: 'Input',
            label: '字段0',
            required: true,
          },
          {
            field: 'field0b',
            component: 'Input',
            label: '字段0',
            required: true,
          },
          {
            field: '0',
            component: 'Input',
            label: ' ',
            slot: 'add',
          },
        ],
        labelWidth: 100,
        actionColOptions: { span: 24 },
        baseColProps: { span: 8 },
      });
  import { useMessage } from '@/hooks/web/useMessage';
      async function handleSubmit() {
        try {
          const data = await validate();
          console.log(data);
        } catch (e) {
          console.log(e);
        }
      }
      const n = ref(1);
      function add() {
        appendSchemaByField(
          {
            field: `field${n.value}a`,
            component: 'Input',
            label: '字段' + n.value,
            required: true,
          },
          '',
        );
        appendSchemaByField(
          {
            field: `field${n.value}b`,
            component: 'Input',
            label: '字段' + n.value,
            required: true,
          },
          '',
        );
        appendSchemaByField(
          {
            field: `${n.value}`,
            component: 'Input',
            label: ' ',
            slot: 'add',
          },
          '',
        );
        n.value++;
      }
      /**
       * @description: 批量添加
       */
      function batchAdd() {
        appendSchemaByField(
          [
            {
              field: `field${n.value}a`,
              component: 'Input',
              label: '字段' + n.value,
              required: true,
            },
            {
              field: `field${n.value}b`,
              component: 'Input',
              label: '字段' + n.value,
              required: true,
            },
            {
              field: `${n.value}`,
              component: 'Input',
              label: ' ',
              slot: 'add',
            },
          ],
          '',
        );
        n.value++;
      }
      function del(field) {
        removeSchemaByField([`field${field}a`, `field${field}b`, `${field}`]);
        n.value--;
      }
      return { register, handleSubmit, add, del, batchAdd };
    },
  const { createMessage } = useMessage();
  const count = ref(0);
  const [register, { appendSchemaByField, removeSchemaByField, validate }] = useForm({
    schemas: [
      {
        field: 'field0a',
        component: 'Input',
        label: '字段0',
        required: true,
      },
      {
        field: 'field0b',
        component: 'Input',
        label: '字段0',
        required: true,
      },
      {
        field: '0',
        label: ' ',
        slot: 'add',
      },
    ],
    labelWidth: 100,
    actionColOptions: { span: 24 },
    baseColProps: { span: 8 },
  });
  async function handleSubmit() {
    try {
      const data = await validate();
      createMessage.success('请前往控制台查看输出');
      console.log(data);
    } catch (e) {
      console.log(e);
    }
  }
  const n = ref(1);
  function add() {
    appendSchemaByField(
      {
        field: `field${n.value}a`,
        component: 'Input',
        label: '字段' + n.value,
        required: true,
      },
      '',
    );
    appendSchemaByField(
      {
        field: `field${n.value}b`,
        component: 'Input',
        label: '字段' + n.value,
        required: true,
      },
      '',
    );
    appendSchemaByField(
      {
        field: `${n.value}`,
        component: 'Input',
        label: ' ',
        slot: 'add',
      },
      '',
    );
    n.value++;
  }
  /**
   * @description: 批量添加
   */
  function batchAdd() {
    appendSchemaByField(
      [
        {
          field: `field${n.value}a`,
          component: 'Input',
          label: '字段' + n.value,
          required: true,
        },
        {
          field: `field${n.value}b`,
          component: 'Input',
          label: '字段' + n.value,
          required: true,
        },
        {
          field: `${n.value}`,
          component: 'Input',
          label: ' ',
          slot: 'add',
        },
      ],
      '',
    );
    n.value++;
  }
  function del(field: string) {
    removeSchemaByField([`field${field}a`, `field${field}b`, `${field}`]);
    n.value--;
  }
  const [
    registerGroup,
    {
      appendSchemaByField: appendSchemaByFieldGroup,
      removeSchemaByField: removeSchemaByFieldGroup,
      getFieldsValue: getFieldsValueGroup,
      setFieldsValue,
    },
  ] = useForm({
    schemas: [
      {
        field: `field[${count.value}].a`,
        component: 'Input',
        label: '字段a',
        colProps: { span: 9 },
      },
      {
        field: `field[${count.value}].b`,
        colProps: { span: 9 },
        component: 'Input',
        label: '字段b',
      },
    ],
    labelWidth: 100,
    actionColOptions: { span: 24 },
    baseColProps: { span: 8 },
  });
  function addGroup() {
    count.value++;
    appendSchemaByFieldGroup(
      [
        {
          field: `field[${count.value}].a`,
          component: 'Input',
          colProps: { span: 9 },
          label: '字段a',
        },
        {
          field: `field[${count.value}].b`,
          component: 'Input',
          colProps: { span: 9 },
          label: '字段b',
        },
      ],
      '',
    );
  }
  function delGroup() {
    removeSchemaByFieldGroup([`field[${count.value}].a`, `field[${count.value}].b`]);
    count.value--;
  }
  function setGroup() {
    setFieldsValue({
      field: [
        {
          a: '默认a',
          b: '默认b',
        },
      ],
    });
  }
  function handleSubmitGroup() {
    createMessage.success('请前往控制台查看输出');
    console.log(getFieldsValueGroup());
  }
</script>