Skip to content

FormGrid

示例

基本使用

<template>
  <div>
    <SuperFormGrid :field="field" :model="form"></SuperFormGrid>
  </div>
</template>

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

const form = reactive({
  name: '',
  sex: '',
  phone: '',
  startTime: '',
  endTime: ''
})
const field = [
  {
    label: '姓名',
    name: 'name',
    el: 'ElInput',
    tooltip: '这是一个提示信息',
    span: 2,
  },
  {
    label: '性别',
    name: 'sex',
    el: 'ElSelect',
    options: [
      { label: '', value: '1' },
      { label: '', value: '2' },
    ],
    span: 2,
  },
  {
    label: '手机号',
    name: 'phone',
    el: 'ElInput',
    span: 2,
  },
  {
    label: '开始时间',
    name: 'startTime',
    el: 'ElDatePicker',
    span: 2,
  },
  {
    label: '结束时间',
    name: 'endTime',
    el: 'ElDatePicker',
    span: 2,
  },
]
</script>

全部禁用

需要配置: disabled

<template>
  <div>
    <SuperFormGrid :field="field" :model="form" disabled></SuperFormGrid>
  </div>
</template>

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

const form = reactive({
  name: '',
  sex: '',
  phone: '',
  startTime: '',
  endTime: ''
})
const field = [
  {
    label: '姓名',
    name: 'name',
    el: 'ElInput',
    tooltip: '这是一个提示信息',
    span: 2,
  },
  {
    label: '性别',
    name: 'sex',
    el: 'ElSelect',
    options: [
      { label: '', value: '1' },
      { label: '', value: '2' },
    ],
    span: 2,
  },
  {
    label: '手机号',
    name: 'phone',
    el: 'ElInput',
    span: 2,
  },
  {
    label: '开始时间',
    name: 'startTime',
    el: 'ElDatePicker',
    span: 2,
  },
  {
    label: '结束时间',
    name: 'endTime',
    el: 'ElDatePicker',
    span: 2,
  },
]
</script>

设置组件属性

需要配置: componentProps

<template>
  <div>
    <SuperFormGrid :field="field" :model="form"></SuperFormGrid>
  </div>
</template>

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

const form = reactive({
  name: '',
  sex: '',
  phone: '',
  startTime: '',
  endTime: '',
  year: '',
  month: '',
})
const field = [
  {
    label: '姓名',
    name: 'name',
    el: 'ElInput',
    componentProps: {
      disabled: true
    },
    tooltip: '这是一个提示信息',
    span: 2,
  },
  {
    label: '性别',
    name: 'sex',
    el: 'ElSelect',
    componentProps: {
      placeholder: '请选择性别',
      clearable: true,
    },
    options: [
      { label: '', value: '1' },
      { label: '', value: '2' },
    ],
    span: 2,
  },
  {
    label: '手机号',
    name: 'phone',
    el: 'ElInput',
    componentProps: {
      placeholder: '请输入手机号',
      clearable: true,
    },
    span: 2,
  },
  {
    label: '开始时间',
    name: 'startTime',
    el: 'ElDatePicker',
    componentProps: {
      placeholder: '请选择开始时间',
      clearable: true,
    },
    span: 2,
  },
  {
    label: '结束时间',
    name: 'endTime',
    el: 'ElDatePicker',
    componentProps: {
      placeholder: '请选择结束时间',
      clearable: true,
    },
    span: 2,
  },
  {
    label: '年份选择',
    name: 'year',
    el: 'ElDatePicker',
    componentProps: {
      placeholder: '请选择年份',
      clearable: true,
      type: 'year',
    },
    span: 2,
  },
  {
    label: '月份选择',
    name: 'month',
    el: 'ElDatePicker',
    componentProps: {
      placeholder: '请选择月份',
      clearable: true,
      type: 'month',
    },
    span: 2,
  },
]
</script>

表单验证

必填验证: required: true 手机号验证: valueType: 'phone' 自定义验证验证: formItemProps: {rules: [required: false, message: '必填', trigger: 'blur']}

<template>
  <div>
    <SuperFormGrid ref="formGrid" :field="field" :model="form">
      <template #append>
        <el-row type="flex" justify="end">
          <el-button size="small" @click="reset">重置</el-button>
          <el-button size="small" type="primary" @click="submit">提交</el-button>
        </el-row>
      </template>
      <div>提交数据: {{ form }}</div>
    </SuperFormGrid>
  </div>
</template>

<script lang="ts" setup>
import { reactive, useTemplateRef } from 'vue'
import { ElMessage } from 'element-plus'

const formGridRef = useTemplateRef('formGrid')
const form = reactive({
  name: '',
  sex: '',
  age: '',
  phone: '',
  startTime: '',
  endTime: '',
  year: '',
  month: '',
})
const field = [
  {
    label: '姓名',
    name: 'name',
    el: 'ElInput',
    required: true,
    tooltip: '这是一个提示信息',
    span: 2,
  },
  {
    label: '性别',
    name: 'sex',
    el: 'ElSelect',
    required: true,
    componentProps: {
      placeholder: '请选择性别',
      clearable: true,
    },
    options: [
      { label: '', value: '1' },
      { label: '', value: '2' },
    ],
    span: 2,
  },
  {
    label: '年龄',
    name: 'age',
    el: 'ElInput',
    required: true,
    formItemProps: {
      rules: [
        {
          validator: (_rule, value, callback) => {
            if (Number(value) > 10) {
              callback()
            } else {
              callback('输入值不能小于10')
            }
          },
          trigger: 'change',
        },
      ],
    },
    span: 2,
  },
  {
    label: '手机号',
    name: 'phone',
    el: 'ElInput',
    componentProps: {
      placeholder: '请输入手机号',
      clearable: true,
    },
    valueType: 'phone',
    span: 2,
  },
  {
    label: '开始时间',
    name: 'startTime',
    el: 'ElDatePicker',
    componentProps: {
      placeholder: '请选择开始时间',
      clearable: true,
    },
    required: true,
    span: 2,
  },
  {
    label: '结束时间',
    name: 'endTime',
    el: 'ElDatePicker',
    componentProps: {
      placeholder: '请选择结束时间',
      clearable: true,
    },
    formItemProps: {
      rules: [{ required: true, message: '请选择结束时间', trigger: 'blur' }],
    },
    span: 2,
  },
  {
    label: '年份选择',
    name: 'year',
    el: 'ElDatePicker',
    componentProps: {
      placeholder: '请选择年份',
      clearable: true,
      type: 'year',
    },
    required: true,
    span: 2,
  },
  {
    label: '月份选择',
    name: 'month',
    el: 'ElDatePicker',
    componentProps: {
      placeholder: '请选择月份',
      clearable: true,
      type: 'month',
    },
    required: true,
    span: 2,
  },
]

const reset = () => {
  formGridRef.value?.formRef?.resetFields()
  ElMessage.success('重置成功')
}
const submit = () => {
  formGridRef.value?.formRef?.validate(valid => {
    if (valid) {
      ElMessage.success('提交成功')
    } else {
      ElMessage.error('请填写必填项')
    }
  })
}
</script>

表单组件联动

需要配置: show 警告:当传递给show是一个响应式数据时, 需要使用函数返回

<template>
  <div>
    <SuperFormGrid :field="field" :model="form"></SuperFormGrid>
  </div>
</template>

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

const form = reactive({
  type: '',
  text: '',
  readio: "",
  checkbox: [],
  select: "",
  date: '',
})
const field = [
  {
    label: '值类型',
    name: 'type',
    el: 'ElSelect',
    componentProps: {
      placeholder: '请选择值类型',
      clearable: true,
    },
    options: [
      { label: '文本', value: '1' },
      { label: '单选', value: '2' },
      { label: '多选', value: '3' },
      { label: '下拉选择', value: '4' },
      { label: '日期', value: '5' },
    ],
    span: 2,
  },
  {
    label: '文本',
    name: 'text',
    el: 'ElInput',
    show: () => form.type === '1',
    span: 2,
  },
  {
    label: '单选',
    name: 'readio',
    el: 'ElRadioGroup',
    options: [
      { label: '选项1', value: '1' },
      { label: '选项2', value: '2' },
      { label: '选项3', value: '3' },
    ],
    show: () => form.type === '2',
    span: 2,
  },
  {
    label: '多选',
    name: 'checkbox',
    el: 'ElCheckboxGroup',
    options: [
      { label: '选项1', value: '1' },
      { label: '选项2', value: '2' },
      { label: '选项3', value: '3' },
    ],
    show: () => form.type === '3',
    span: 2,
  },
  {
    label: '下拉选择',
    name: 'select',
    el: 'ElSelect',
    options: [
      { label: '选项1', value: '1' },
      { label: '选项2', value: '2' },
      { label: '选项3', value: '3' },
    ],
    show: () => form.type === '4',
    span: 2,
  },
  {
    label: '日期',
    name: 'date',
    el: 'ElDatePicker',
    show: () => form.type === '5',
    span: 2,
  },
]
</script>

使用插槽

需要配置: show

<template>
  <div>
    <SuperFormGrid :field="field" :model="form">
      <template #componentSlot>
        <ElInput v-model="form.message" placeholder="使用插槽自定义内容" clearable />
      </template>
      <template #formGridSlotComponent>
        <SuperGrid :gap="[10, 20]">
          <SuperGridItem :span="4">
            <el-form-item label="活动时间:">
              <div class="flx-center">
                <el-date-picker
                  type="date"
                  placeholder="选择日期"
                  v-model="form.activeStart"
                  style="width: 100%"
                ></el-date-picker>
                <span class="line">-</span>
                <el-time-picker
                  placeholder="选择时间"
                  v-model="form.activeEnd"
                  style="width: 100%"
                ></el-time-picker>
              </div>
            </el-form-item>
          </SuperGridItem>
        </SuperGrid>
      </template>

      表单数据: {{ form }}
    </SuperFormGrid>
  </div>
</template>

<script lang="tsx" setup>
import { reactive } from 'vue'
import { ElInput } from "element-plus"

const form = reactive({
  minAge: '',
  maxAge: '',
  message: '',
  activeStart: '',
  activeEnd: '',
})
const field = [
  {
    label: '年龄使用render渲染',
    name: 'age',
    el: 'ElInput',
    componentProps: {
      placeholder: '请输入姓名',
      clearable: true,
    },
    render: ({ searchParam }: any) => {
      // 普通v-model但无法使用修饰符
      return (
        <div class="flx-center">
          <ElInput v-model={searchParam.minAge} placeholder="最小年龄" />
          <span class="mr10 ml10">-</span>
          <ElInput v-model={searchParam.maxAge} placeholder="最大年龄" />
        </div>
      )
    },
    span: 4,
  },
  {
    label: '使用组件插槽',
    name: 'message',
    slotName: 'componentSlot',
    span: 4,
  },
  {
    label: '使用布局插槽',
    name: 'date',
    slotName: 'formGridSlotComponent',
    span: 4,
  },
]
</script>

API

formGrid Props

参数说明类型可选值默认值
field表单配置列formItemProps[]-[]
model表单数据绑定object-{}
searchCol响应式布局参数number/object-{ xs: 1, sm: 2, md: 3, lg: 4, xl: 4 }
ifCardStyle是否使用 card 样式booleantrue/falsetrue

formGridItem Props

参数说明类型可选值默认值
el渲染组件名称strigng--
label标题名称string--
nameprops绑定名称string--
labelWidth标题宽度number--
tooltip标题文字提示string--
required是否必填boolean--
valueType内置验证规则类型string--
fieldNames指定 label && value && children 的 key 值 可以指定el-select他们的labelkey或valueKeyobjectobject-
options下拉选项数据EnumProps[]object-
span表单项所占用的列数number-1
offset表单项左侧偏移列数number--
render自定义表单项内容渲染(scope: SearchRenderScope) => VNode--
scopedSlots组件内插槽any--
formItemProps透传 el-form-item 属性Partial<FormItemProps>--
componentProps透传组件属性any--

formGrid Slots

插槽名说明
slotName自定义搜索内容插槽名称
append自定义表单尾部内容
default默认插槽,出现在表单底部

formGridItem Slots

插槽名说明
slotName组件内插槽