GroupForm
Based on ZForm component and ElDivider component encapsulation.
Basic Usage
Pass group to form type type, configure children (form items) in columns to implement grouped form.
<!-- eslint-disable no-console -->
<!-- eslint-disable no-alert -->
<script lang="ts" setup>
import { ref } from 'vue'
const formRef = ref()
const formData = ref({
name: '',
gender: '',
time: [],
})
const options = {
gender: [
{ label: 'Male', value: '1' },
{ label: 'Female', value: '2' },
],
}
const columns = [
{
label: 'Group 1',
children: [
{
component: 'input',
field: 'name',
label: 'Name',
required: true,
},
],
},
{
label: 'Group 2',
children: [
{
component: 'select',
field: 'gender',
label: 'Gender',
extra: 'Gender options',
required: true,
},
{
component: 'el-date-picker',
field: 'time',
label: 'Date',
fieldProps: {
type: 'daterange',
startPlaceholder: 'Start date',
endPlaceholder: 'End date',
},
},
],
},
{
slot: 'operate',
},
]
function reset() {
formRef.value.resetFields()
}
function submit() {
formRef.value.validate((valid: boolean) => {
if (valid) {
alert('submit!')
console.log(formData.value, 'config.formData')
}
else {
console.log('error submit!!')
return false
}
})
}
</script>
<template>
<z-form
ref="formRef"
v-model="formData"
:options="options"
:columns="columns"
label-width="80px"
size="small"
type="group"
>
<template #operate>
<div class="w-full flex">
<el-button class="w-full" @click="reset">
Reset
</el-button>
<el-button type="primary" class="w-full" @click="submit">
Submit
</el-button>
</div>
</template>
</z-form>
</template>Divider Configuration
Configure borderStyle in column to modify divider style, supports 'none' | 'solid' | 'hidden' | 'dashed' | ....
<!-- eslint-disable no-console -->
<!-- eslint-disable no-alert -->
<script lang="ts" setup>
import { ref } from 'vue'
const formRef = ref()
const formData = ref({
name: '',
gender: '',
time: [],
})
const options = {
gender: [
{ label: 'Male', value: '1' },
{ label: 'Female', value: '2' },
],
}
const columns = [
{
label: 'Group 1',
borderStyle: 'dashed',
children: [
{
component: 'input',
field: 'name',
label: 'Name',
},
],
},
{
label: 'Group 2',
borderStyle: 'hidden',
children: [
{
component: 'select',
field: 'gender',
label: 'Gender',
},
{
component: 'el-date-picker',
field: 'time',
label: 'Date',
fieldProps: {
type: 'daterange',
startPlaceholder: 'Start date',
endPlaceholder: 'End date',
},
},
],
},
{
slot: 'operate',
},
]
function reset() {
formRef.value.resetFields()
}
function submit() {
formRef.value.validate((valid: boolean) => {
if (valid) {
alert('submit!')
console.log(formData.value, 'config.formData')
}
else {
console.log('error submit!!')
return false
}
})
}
</script>
<template>
<z-form
ref="formRef"
v-model="formData"
:options="options"
:columns="columns"
label-width="80px"
size="small"
type="group"
>
<template #operate>
<div class="w-full flex">
<el-button class="w-full" @click="reset">
Reset
</el-button>
<el-button type="primary" class="w-full" @click="submit">
Submit
</el-button>
</div>
</template>
</z-form>
</template>Content Position
Configure divider content position with contentPosition attribute in column, supports 'left' | 'right' | 'center'.
<!-- eslint-disable no-console -->
<!-- eslint-disable no-alert -->
<script lang="ts" setup>
import { ref } from 'vue'
const formRef = ref()
const formData = ref({
name: '',
gender: '',
time: [],
})
const options = {
gender: [
{ label: 'Male', value: '1' },
{ label: 'Female', value: '2' },
],
}
const columns = [
{
label: 'Group 1',
children: [
{
component: 'input',
field: 'name',
label: 'Name',
},
],
},
{
label: 'Group 2',
contentPosition: 'center',
children: [
{
component: 'select',
field: 'gender',
label: 'Gender',
},
{
component: 'el-date-picker',
field: 'time',
label: 'Date',
fieldProps: {
type: 'daterange',
startPlaceholder: 'Start date',
endPlaceholder: 'End date',
},
},
],
},
{
slot: 'operate',
},
]
function reset() {
formRef.value.resetFields()
}
function submit() {
formRef.value.validate((valid: boolean) => {
if (valid) {
alert('submit!')
console.log(formData.value, 'config.formData')
}
else {
console.log('error submit!!')
return false
}
})
}
</script>
<template>
<z-form
ref="formRef"
v-model="formData"
:options="options"
:columns="columns"
label-width="80px"
size="small"
type="group"
content-position="left"
>
<template #operate>
<div class="w-full flex">
<el-button class="w-full" @click="reset">
Reset
</el-button>
<el-button type="primary" class="w-full" @click="submit">
Submit
</el-button>
</div>
</template>
</z-form>
</template>Custom Content
label supports not only strings, but also h functions, render functions and slot (needs slot string, case insensitive).
<!-- eslint-disable no-console -->
<!-- eslint-disable no-alert -->
<script lang="ts" setup>
import { h, ref } from 'vue'
const formRef = ref()
const formData = ref({
name: '',
gender: '',
time: [],
})
const options = {
gender: [
{ label: 'Male', value: '1' },
{ label: 'Female', value: '2' },
],
}
const columns = [
{
label: () => h('span', 'Group 1'),
children: [
{
component: 'input',
field: 'name',
label: 'Name',
rules: {
required: true,
},
},
],
},
{
label: 'labelSlot',
children: [
{
component: 'select',
field: 'gender',
label: 'Gender',
},
{
component: 'el-date-picker',
field: 'time',
label: 'Date',
fieldProps: {
type: 'daterange',
startPlaceholder: 'Start date',
endPlaceholder: 'End date',
},
},
],
},
{
slot: 'operate',
},
]
function reset() {
formRef.value.resetFields()
}
function submit() {
formRef.value.validate((valid: boolean) => {
if (valid) {
alert('submit!')
console.log(formData.value, 'config.formData')
}
else {
console.log('error submit!!')
return false
}
})
}
</script>
<template>
<z-form
ref="formRef"
v-model="formData"
:options="options"
:columns="columns"
label-width="80px"
size="small"
type="group"
>
<template #labelSlot>
Copy 2
</template>
<template #operate>
<div class="w-full flex">
<el-button class="w-full" @click="reset">
Reset
</el-button>
<el-button type="primary" class="w-full" @click="submit">
Submit
</el-button>
</div>
</template>
</z-form>
</template>Form Attributes
Please refer to ZForm component basic usage documentation.
Column Attributes (Specific)
| Attribute | Description | Type | Default |
|---|---|---|---|
| label | Divider content | string / () => VNode | — |
| border-style | Set divider style | none / solid / hidden / dashed / ... | solid |
| content-position | Custom position of divider content | left / right / center | center |
| children | Form items in current group (all normal column attributes) | array | — |