标签输入框,设置 type: 'inputTags',适合自由文本标签:
<script lang="ts" setup>
import type { FormSubmitEvent } from '@nuxt/ui'
import type { z } from 'zod/v4'
const { afz } = useAutoForm()
const toast = useToast()
const schema = afz.object({
tags: afz.array(afz.string(), {
type: 'inputTags'
})
.default(['tag1', 'tag2'])
.meta({
label: '标签输入',
hint: '输入后按 Enter 添加标签'
})
})
async function onSubmit(event: FormSubmitEvent<z.output<typeof schema>>) {
toast.add({
title: 'Success',
color: 'success',
description: JSON.stringify(event.data, null, 2)
})
}
</script>
<template>
<MAutoForm :schema="schema" @submit="onSubmit" />
</template>
复选框组,设置 type: 'checkboxGroup',适合预定义选项多选:
<script lang="ts" setup>
import type { FormSubmitEvent } from '@nuxt/ui'
import type { z } from 'zod/v4'
const { afz } = useAutoForm()
const toast = useToast()
const schema = afz.object({
notifications: afz.array(afz.string(), {
type: 'checkboxGroup',
controlProps: {
items: [
{ label: '邮件', value: 'email' },
{ label: '短信', value: 'sms' },
{ label: '电话', value: 'phone' }
]
}
})
.default(['email'])
.meta({
label: '复选框组',
hint: '多选通知方式'
})
})
async function onSubmit(event: FormSubmitEvent<z.output<typeof schema>>) {
toast.add({
title: 'Success',
color: 'success',
description: JSON.stringify(event.data, null, 2)
})
}
</script>
<template>
<MAutoForm :schema="schema" @submit="onSubmit" />
</template>
对象数组自动使用折叠面板渲染,支持添加、删除项:
<script lang="ts" setup>
import type { FormSubmitEvent } from '@nuxt/ui'
import type { z } from 'zod/v4'
const { afz } = useAutoForm()
const toast = useToast()
const schema = afz.object({
experience: afz.array(
afz.object({
company: afz.string({
controlProps: {
placeholder: '公司名称'
}
}).min(1).meta({ label: '公司' }),
position: afz.string({
controlProps: {
placeholder: '职位'
}
}).min(1).meta({ label: '职位' }),
years: afz.number({
controlProps: {
placeholder: '工作年限'
}
}).int().min(0).max(50).meta({ label: '年限', hint: '工作年数' })
}).meta({ label: '工作经历' })
).default([{
company: '示例公司',
position: '软件工程师',
years: 3
}]).meta({
label: '工作经历列表',
collapsible: { defaultOpen: true }
})
})
async function onSubmit(event: FormSubmitEvent<z.output<typeof schema>>) {
toast.add({
title: 'Success',
color: 'success',
description: JSON.stringify(event.data, null, 2)
})
}
</script>
<template>
<UCard>
<MAutoForm :schema="schema" @submit="onSubmit" />
</UCard>
</template>
创建和管理动态添加或删除元素的表单数组。
<script lang="ts" setup>
import type { FormSubmitEvent } from '@nuxt/ui'
import type { z } from 'zod/v4'
const { afz } = useAutoForm()
const toast = useToast()
const schema = afz.object({
items: afz.array(
afz.object({
name: afz.string().meta({ label: '商品名称' }),
quantity: afz.number().int().default(1).meta({ label: '数量', hint: '默认为 1' }),
price: afz.number().min(0).meta({ label: '价格' })
}).meta({ label: '商品', hint: '请填写商品信息' })
).default([
{ name: '苹果', quantity: 2, price: 5.99 },
{ name: '香蕉', quantity: 1, price: 3.99 }
]).meta({ label: '商品列表' })
})
type Schema = z.output<typeof schema>
const form = ref<Partial<Schema>>({})
async function onSubmit(event: FormSubmitEvent<Schema>) {
toast.add({
title: '提交成功',
color: 'success',
description: JSON.stringify(event.data, null, 2)
})
}
</script>
<template>
<UCard>
<MAutoForm
:schema="schema"
:state="form"
:global-meta="{
collapsible: { defaultOpen: true }
}"
:add-button-props="{
color: 'primary',
variant: 'soft',
block: false
}"
@submit="onSubmit"
/>
</UCard>
</template>
afz.array(elementSchema, meta?)
定义数组元素的类型,决定输出类型为 T[]:
// 字符串数组
const schema1 = afz.array(afz.string())
// 输出类型:string[]
// 对象数组
const schema2 = afz.array(afz.object({
name: afz.string(),
age: afz.number()
}))
// 输出类型:{ name: string, age: number }[]
afz.array(afz.object({...}))),系统会自动使用折叠面板渲染,无需手动指定控件类型。不指定控件类型,数组元素使用默认映射:
afz.array(afz.string(), {
label: '标签列表',
hint: '添加多个标签'
})
// string[] - 元素默认使用 input 控件
通过 type 覆盖数组元素的默认控件,输出类型保持不变:
afz.array(afz.string(), {
type: 'checkboxGroup', // 覆盖 string 的默认 input 控件
controlProps: {
items: ['reading', 'gaming', 'sports']
}
})
// 输出类型仍为:string[]
// 但使用 checkboxGroup 渲染(多选)
afz.string() 本来会被映射为 input 控件,通过第二个参数的 type: 'checkboxGroup' 覆盖了这个默认映射,将其改为多选框形式。直接传入自定义组件实例:
import MyArrayControl from './MyArrayControl.vue'
afz.array(afz.string(), {
component: MyArrayControl,
controlProps: { /* ... */ }
})