Skip to content

表单业务组件

基础用法

基础用法
根据配置生成表单
<template>
  <su-form 
    class="vp-raw" 
    :formList="formData"
    :formParam="formParam"
    @cancel="handleCancel"
    @submit="handleSubmit"
  ></su-form>
</template>

<script setup lang="ts">
import { reactive } from 'vue';

const formData: any = reactive([
    {
        name: 'switch',
        title: '开关',
        key: 'switch',
        value: true,
        wrapperCol: { span: 1 },
    },
    {
        name: 'radio',
        title: '单选框',
        key: 'radio',
        enum: [
            { label: 'Apple', value: 'Apple' },
            { label: 'Pear', value: 'Pear' },
            { label: 'Orange', value: 'Orange' },
        ],
    },
    {
        name: 'checkbox',
        title: '多选框',
        key: 'checkbox',
        enum: ['Apple', 'Pear', 'Orange'],
    },
    {
        name: 'select',
        title: '选择框',
        key: 'select1',
        value: '',
        enum: [
            {
                value: '前端',
                label: '前端',
            },
            {
                value: '后端',
                label: '后端',
            },
        ],
    },
    {
        name: 'timePicker',
        title: '时间1',
        key: 'timePicker1',
        value: '',
        format: 'HH:mm:ss',
    },
    {
        name: 'timeRangePicker',
        title: '时间2',
        key: 'timeRangePicker',
    },
    {
        name: 'datePicker',
        title: '时间3',
        key: 'datePicker',
    },
    {
        name: 'dateRangePicker',
        title: '时间4',
        key: 'dateRangePicker',
    },
    {
        name: 'cascader',
        title: '地址',
        key: 'cascader',
        value: ['zhejiang'],
        enum: [
            {
                value: 'zhejiang',
                label: 'zhejiang',
                children: [
                    {
                        value: 'hangzhou',
                        label: 'Hangzhou',
                        children: [
                            {
                                value: 'xihu',
                                label: 'West Lake',
                            },
                        ],
                    },
                ],
            },
        ],
    },
]);

// 初始化搜索值
let formParam: any = reactive({});
const initSearch = () => {
    formData.forEach((item: any) => {
        formParam[item.key] = item.value;
    });
};
initSearch();

const handleCancel = () => {
    initSearch();
};

const handleSubmit = () => {
    console.log('submit', formParam);
};

</script>

动态获取下拉数据

动态获取
动态设置表单的下拉数据
<template>
  <su-form 
    class="vp-raw"
    :formList="formData"
    :formParam="formParam"
    @cancel="handleCancel"
    @submit="handleSubmit"
  ></su-form>
</template>

<script setup lang="ts">
import { reactive } from 'vue';

// 模拟请求数据
const getSelectData = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({
        code: 200,
        data: [
          {
            label: "在线",
            value: 1
          },
          {
            label: "离线",
            value: 0
          }
        ]
      })
    },500)
  })
}

const formData: any = reactive([
    {
        name: 'radio',
        title: '单选框',
        key: 'radio',
        api: getSelectData,
    },
    {
        name: 'checkbox',
        title: '多选框',
        key: 'checkbox',
        api: getSelectData,
    },
    {
        name: 'select',
        title: '选择框',
        key: 'select1',
        value: '',
        api: getSelectData,
    },
]);

// 初始化搜索值
let formParam: any = reactive({});
const initSearch = () => {
    formData.forEach((item: any) => {
        formParam[item.key] = item.value;
    });
};
initSearch();

const handleCancel = () => {
    initSearch();
};

const handleSubmit = () => {
    console.log('submit', formParam);
};

</script>

校验表单

校验表单
根据rule设置表单校验规则
<template>
  <su-form 
    class="vp-raw"
    :formList="formData"
    :formParam="formParam"
    @cancel="handleCancel"
    @submit="handleSubmit"
  ></su-form>
</template>

<script setup lang="ts">
import { reactive } from 'vue';

const formData: any = reactive([
    {
        name: 'radio',
        title: '单选框',
        key: 'radio',
        enum: [
            { label: 'Apple', value: 'Apple' },
            { label: 'Pear', value: 'Pear' },
            { label: 'Orange', value: 'Orange' },
        ],
        rules: [
            {
                required: true,
                message: '请选择单选框'
            },
        ],
    },
    {
        name: 'checkbox',
        title: '多选框',
        key: 'checkbox',
        enum: ['Apple', 'Pear', 'Orange'],
        rules: [
            {
                required: true,
                message: '请至少选择一个多选框'
            },
        ],
    },
    {
        name: 'select',
        title: '选择框',
        key: 'select1',
        value: '',
        enum: [
            {
                value: '前端',
                label: '前端',
            },
            {
                value: '后端',
                label: '后端',
            },
        ],
        rules: [
            {
                required: true,
                message: '请选择'
            },
        ],
    },
    {
        name: 'timePicker',
        title: '时间',
        key: 'timePicker1',
        value: '',
        format: 'HH:mm:ss',
        rules: [
            {
                required: true,
                message: '请选择时间'
            },
        ],
    },
]);

// 初始化搜索值
let formParam: any = reactive({});
const initSearch = () => {
    formData.forEach((item: any) => {
        formParam[item.key] = item.value;
    });
};
initSearch();

const handleCancel = () => {
    initSearch();
};

const handleSubmit = () => {
    console.log('submit', formParam);
};

</script>

使用插槽

使用插槽
定义插槽使用自定义组件
<template>
  <su-form
    class="vp-raw"
    :formList="formData"
    :formParam="formParam"
    @cancel="handleCancel"
    @submit="handleSubmit"
  >
    <template #hhh>
        <input :value="formParam.slotkey" />
    </template>
  </su-form>
</template>

<script setup lang="ts">
import { reactive } from 'vue';

const formData: any = reactive([
    {
        name: 'slot',
        slotName: 'hhh',
        title: '插槽',
        key: 'slotkey',
        value: '插槽的使用',
    }
]);

// 初始化搜索值
let formParam: any = reactive({});
const initSearch = () => {
    formData.forEach((item: any) => {
        formParam[item.key] = item.value;
    });
};
initSearch();

const handleCancel = () => {
    initSearch();
};

const handleSubmit = () => {
    console.log('submit', formParam);
};
</script>

动态变更表单项

动态变更表单项
定义插槽使用自定义组件
<template>
  <div>
    <div>
      <a-button style="margin-right: 24px" @click="addInput">添加一个输入框</a-button>
      <a-button @click="delInput" :disabled="formData.length === 1">减少一个输入框</a-button>
    </div>
    <su-form
      class="vp-raw"
      ref="changeFormRef"
      :formList="formData"
      :formParam="formParam"
      @cancel="handleCancel"
      @submit="handleSubmit"
    ></su-form>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive } from "vue";

let formData: any = reactive([
  {
    name: "input",
    title: "输入框1",
    key: "input1",
  },
]);

// 初始化搜索值
let formParam: any = reactive({});
const initSearch = () => {
  formData.forEach((item: any) => {
    formParam[item.key] = item.value || '';
  });
};
initSearch();

let changeFormRef = ref();

const addInput = () => {
  let index =
    formData.filter((v: { name: string }) => v.name === "input").length + 1;
  formData.push({
    name: "input",
    title: `输入框${index}`,
    key: `input${index}`,
  });
  initSearch()
  changeFormRef.value.updateForm();
};

const delInput = () => {
  formData.splice(formData.length - 1, 1)
  formParam = {}
  initSearch()
  changeFormRef.value.updateForm();
};

const handleCancel = () => {
  initSearch();
};

const handleSubmit = () => {
  console.log("submit", formParam);
};
</script>

表单组件参数配置

参数

说明

类型

默认值

formList表单配置itemType[]配置请查看下方FormList表单配置
formParam表单数据string、number、string[]、number[]、boolean数值需要根据formList去生成,请查看下方FormParam生成方法
bottomBtnWrapper底部按钮的右侧宽度number--
bottomBtnLabel底部按钮的左侧宽度number--
submitText提交按钮文案string'创建'
cancelText取消按钮文案string'取消'
showBtns是否显示底部按钮booleantrue
subLoading确认按钮的加载状态booleanfalse

表单回调方法

参数

说明

类型

示例

submit点击提交的按钮function--
cancel点击取消的按钮function--
itemChange组件值改变时触发的回调function--

表单单项配置

参数

说明

类型

示例

key表单组件键值string唯一的key值
name表单组件类别stringinput 、InputNumber 、select 、timePicker 、 timeRangePicker 、datePicker 、dateRangePicker 、cascader、switch、radio、checkbox、slot
slotName自定义组件--当name值为slot时可使用
value表单组件初始值--string、number、string[]、number[]、boolean
enumselect组件搜索项array下拉列表数据,默认取value、label
labelName自定义枚举文字string更改下拉数据取值
valueName自定义枚举值string更改下拉数据取值
api动态枚举function获取接口返回的下拉数据
params动态获取枚举的参数object{}
style组件左侧文字样式string设置文字行内样式
format时间类选项输出的格式string使用dayjs格式化时间格式:'YYYY MM DD hh:mm:ss'
optionType组合式radiostring沿用自antd Table组件
width表格列宽度number沿用自antd Table组件
mininputNumber组件最小值number沿用自antd InputNumber组件
maxinputNumber组件最大值number沿用自antd InputNumber组件
placeholder组件无值时显示的文字string沿用自antd InputNumber组件
labelCol组件左侧文件宽度string沿用自antd InputNumber组件
labelAlign组件左侧文件定位string沿用自antd InputNumber组件
wrapperCol组件宽度string沿用自antd InputNumber组件
picker日期选项样式string沿用自antd InputNumber组件
rules数据校验object[]沿用自antd Form组件

FormParam生成方法

let formParam: any = reactive({});
// 初始化搜索值
const initSearch = () => {
  formData.forEach((item: itemType) => {
    formParam[item.key] = item.value || '';
  });
};
initSearch();