Skip to content

form 表单

以数据驱动的form表单组件

所有属性都继承自element-plus

基础用法

<template>
  <div>
    <g-form :model="data" :col-num="1" :columns="formColums"></g-form>
    <div class="flex-jasc-end">
      <g-button @click="handleSubmit" type="primary">提交</g-button>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ElMessage } from 'element-plus';
import { GForm, GButton, ITableOrFormColumn } from 'gao-components-plus';
import { ref } from 'vue';
type TFormData = {
  name: string
  age: number
  job: number
  remark: string
  birth: string
}
const data = ref<TFormData>({} as TFormData)
const formColums = ref<ITableOrFormColumn<TFormData>[]>([
  {label: '姓名', prop: 'name', type: 'input'},
  {label: '年龄', prop: 'age', type: 'number'},
  {label: '出生日期', prop: 'birth', type: 'date'},
  {label: '职业', prop: 'job', type: 'select', options: [{label: '军人', value: 1}, {label: '教师', value: 2}]},
  {label: '备注', prop: 'remark', type: 'textarea'},
])

function handleSubmit() {
  ElMessage.success(`内容为==>${JSON.stringify(data.value)}`)
}
</script>

使用template自定义表单项

<template>
  <div>
    <g-form :model="data" :col-num="1" :columns="formColums">
      <template #age="scoped">自定义的age字段{{ scoped }}</template>
    </g-form>
    <div class="flex-jasc-end">
      <g-button @click="handleSubmit" type="primary">提交</g-button>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ElMessage } from 'element-plus';
import { GForm, GButton, ITableOrFormColumn } from 'gao-components-plus';
import { ref } from 'vue';

type TFormData = {
  name: string
  age: number
}

const data = ref<TFormData>({} as TFormData)
const formColums = ref<ITableOrFormColumn<TFormData>[]>([
  {label: '姓名', prop: 'name', type: 'input'},
  {label: '年龄', prop: 'age', type: 'number'}
])

function handleSubmit() {
  ElMessage.success(`内容为==>${JSON.stringify(data.value)}`)
}
</script>

使用formRender自定义表单项

<template>
  <div>
    <g-form :model="data" :col-num="1" :columns="formColums"></g-form>
    <div class="flex-jasc-end">
      <g-button @click="handleSubmit" type="primary">提交</g-button>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ElMessage } from 'element-plus';
import { GForm, GButton, ITableOrFormColumn } from 'gao-components-plus';
import { ref } from 'vue';

type TFormData = {
  name: string
  age: number
}

const data = ref<TFormData>({} as TFormData)
const formColums = ref<ITableOrFormColumn<TFormData>[]>([
  {label: '姓名', prop: 'name', type: 'input', formRender({column, data}) {
    return `自定义的==${column.label} ==${data.name}`
  }},
  {label: '年龄', prop: 'age', type: 'number'}
])

function handleSubmit() {
  ElMessage.success(`内容为==>${JSON.stringify(data.value)}`)
}
</script>

input原生插槽

<template>
  <div>
    <g-form :model="data" :col-num="1" :columns="formColums"></g-form>
  </div>
</template>

<script setup lang="ts">
import { ElMessage } from 'element-plus';
import { GForm, ITableOrFormColumn } from 'gao-components-plus';
import { ref } from 'vue';

type TFormData = {
  name: string
  age: number
}

const data = ref<TFormData>({} as TFormData)
const formColums = ref<ITableOrFormColumn<TFormData>[]>([
  {label: '姓名', prop: 'name', type: 'input', prefix: 'prefix', suffix: 'suffix', prepend: 'prepend', append: 'append', placeholder: '请输入姓名'},
  {label: '年龄', prop: 'age', type: 'number', placeholder: '请输入年龄'},
])

</script>

校验

分别支持rules和columns中的rules

<template>
  <div>
    <g-form ref="formRef" :model="data" :rules="rules" :col-num="1" :columns="formColums"></g-form>
    <div class="flex-jasc-end">
      <g-button @click="handleSubmit" type="primary">校验</g-button>
    </div>
  </div>
</template>

<script setup lang="ts">
import { FormRules } from 'element-plus';
import { ElMessage } from 'element-plus';
import { GFormInstance, ITableOrFormColumn } from 'gao-components-plus';
import { GForm, GButton } from 'gao-components-plus';
import { ref, useTemplateRef } from 'vue';

type TFormData = {
  name: string
  age: number
}

const formRef = useTemplateRef<GFormInstance>('formRef')


const data = ref<TFormData>({} as TFormData)
// 校验规则
const rules = ref<FormRules>({
  age: {required: true, message: '通过props.rules校验==年龄不能为空', trigger: 'blur'},
})
// 
const formColums = ref<ITableOrFormColumn<TFormData>[]>([
  {label: '姓名', prop: 'name', type: 'input', placeholder: '请输入姓名', rules: {required: true, message: '通过columns配置校验规则==姓名不能为空', trigger: 'blur'}},
  {label: '年龄', prop: 'age', type: 'number', placeholder: '请输入年龄'},
])

async function handleSubmit() {
  const ret = await formRef.value?.GForm?.validate().catch(() => false)
  if(ret) return ElMessage.success('校验通过')
}
</script>

属性

除以下属性外,其他属性都继承自element-plus

名称描述类型默认值
model绑定的数据Object-
rules校验规则FormRules-
colNum表单列数Number1
columns表单项配置IformITableOrFormColumn[]-
labelWidthlabel宽度String Numberauto

columns配置项

名称描述类型默认值
labellabelString-
prop绑定的keyString-
type表单项类型'input' 'textarea' 'number' 'color' 'upload' 'select' 'radio' 'switch' 'date' 'dates' 'daterange' 'datetime' 'datetimerange' 'month' 'months' 'monthrange''year' 'years' 'yearrange' 'week' 'weekrange'-
labelWidthlabel宽度string | number继承gform
span列宽 能被24整除的整数number24/colNum
clearable可被清除booleanfalse
showAlpha颜色是否显示透明(仅type=color)booleantrue
unlinkPanels左右无关联(仅type=daterange、datetimerange、monthrange、yearrange、weekrange)string-
renderPickerCell日期自定义渲染(仅type=daterange、datetimerange、monthrange、yearrange、weekrange)(cell: DateCell) => VNode | string-
options下拉选项(仅type=select、radio)Array-
uploadConfig上传文件配置GUploadProps-
onInputinput事件(value) => void-
onChangechange事件(value) => void-
formRender自定义渲染表单项({column, data}) => VNode | string-
labelRender自定义渲染label({column, data}) => VNode | string-
labelTipslabel提示string-

方法&实例

vue
<g-form ref="formRef"></g-form>
<script>
const formRef = useTemplateRef<GFormInstance>('formRef')

formRef.value?.GForm 返回的是element-plus的form实例

</script>

Released under the MIT License.