表单组件概览
本章节介绍了完整的表单组件库,这些组件基于 Element Plus 构建,提供了统一的 API 设计和丰富的功能特性。
组件列表
基础表单组件
- AForm - 表单容器,提供统一的表单布局和验证
- AFormInput - 输入框组件,支持多种输入类型
- AFormSelect - 选择器组件,支持单选和多选
- AFormRadio - 单选框组件,支持按钮和标准样式
- AFormCheckbox - 复选框组件,支持多种配置
- AFormSwitch - 开关组件,适用于布尔值切换
- AFormDate - 日期选择组件,支持日期和时间选择
高级表单组件
- AFormCascader - 级联选择组件,支持地区和自定义数据
- AFormTreeSelect - 树形选择组件,适用于层级数据
- AFormEditor - 富文本编辑器,支持图片上传和格式化
- AFormFileUpload - 文件上传组件,支持多种文件类型
- AFormImgUpload - 图片上传组件,专门用于图片处理
- IconSelect - 图标选择器,提供可视化图标选择
设计原则
1. 统一的 API 设计
所有表单组件都遵循相同的属性命名规范:
vue
<template>
<!-- 基础属性 -->
<AFormInput
v-model="form.field"
label="字段名"
prop="field"
:span="12"
tooltip="提示信息"
/>
</template>
通用属性:
modelValue
/v-model
- 双向绑定值label
- 表单标签prop
- 表单字段名(用于验证)span
- 栅格占比(1-24)tooltip
- 提示信息disabled
- 是否禁用size
- 组件尺寸showFormItem
- 是否显示表单项包装
2. 灵活的布局系统
支持三种使用方式:
vue
<template>
<!-- 1. 带栅格布局的表单项 -->
<AFormInput v-model="form.name" label="姓名" prop="name" :span="12" />
<!-- 2. 不带栅格的表单项 -->
<AFormInput v-model="form.name" label="姓名" prop="name" />
<!-- 3. 纯组件(不包装表单项) -->
<AFormInput v-model="form.name" :show-form-item="false" />
</template>
3. 国际化支持
所有组件都支持国际化,会自动翻译标签和占位符:
vue
<template>
<!-- 标签和占位符会自动翻译 -->
<AFormInput v-model="form.userName" label="用户名" prop="userName" />
</template>
4. 丰富的事件系统
每个组件都提供完整的事件支持:
vue
<template>
<AFormInput
v-model="form.name"
@change="handleChange"
@blur="handleBlur"
@focus="handleFocus"
/>
</template>
快速开始
基础表单示例
vue
<template>
<el-form :model="form" :rules="rules" ref="formRef">
<el-row :gutter="20">
<AFormInput
v-model="form.userName"
label="用户名"
prop="userName"
:span="12"
/>
<AFormSelect
v-model="form.status"
:options="statusOptions"
label="状态"
prop="status"
:span="12"
/>
<AFormDate
v-model="form.createTime"
label="创建时间"
prop="createTime"
:span="12"
/>
<AFormSwitch
v-model="form.enabled"
label="启用状态"
prop="enabled"
:span="12"
/>
</el-row>
</el-form>
</template>
<script setup>
const form = reactive({
userName: '',
status: '',
createTime: '',
enabled: true
})
const statusOptions = [
{ label: '启用', value: '1' },
{ label: '禁用', value: '0' }
]
const rules = {
userName: [{ required: true, message: '请输入用户名' }],
status: [{ required: true, message: '请选择状态' }]
}
</script>
搜索表单示例
vue
<template>
<ASearchForm v-model="queryParams" @search="handleSearch" @reset="handleReset">
<AFormInput
v-model="queryParams.keyword"
label="关键词"
prop="keyword"
@input="handleQuery"
/>
<AFormSelect
v-model="queryParams.status"
:options="statusOptions"
label="状态"
prop="status"
@change="handleQuery"
/>
<AFormDate
v-model="queryParams.dateRange"
type="daterange"
label="时间范围"
@change="handleQuery"
/>
</ASearchForm>
</template>
主要特性
1. 智能提示和工具提示
所有组件都支持 tooltip
属性,提供额外的帮助信息:
vue
<template>
<AFormInput
v-model="form.password"
type="password"
label="密码"
tooltip="密码长度至少8位,包含字母和数字"
/>
</template>
2. 自定义字段映射
支持灵活的数据结构映射:
vue
<template>
<AFormSelect
v-model="form.userId"
:options="userList"
value-field="id"
label-field="name"
label="用户"
/>
</template>
3. 条件禁用
支持复杂的禁用条件:
vue
<template>
<AFormSelect
v-model="form.roleId"
:options="roleList"
disabled-field="status"
:disabled-value="['0', '3']"
label="角色"
/>
</template>
4. 插槽支持
大部分组件都支持插槽扩展:
vue
<template>
<AFormInput v-model="form.amount" label="金额">
<template #prepend>¥</template>
<template #append>.00</template>
</AFormInput>
</template>
样式定制
1. 全局样式配置
通过 CSS 变量可以全局定制组件样式:
css
:root {
--el-color-primary: #409eff;
--el-border-radius-base: 4px;
--el-font-size-base: 14px;
}
2. 组件级样式
每个组件都支持自定义类名和样式:
vue
<template>
<AFormInput
v-model="form.name"
class="custom-input"
style="--el-input-border-color: red;"
/>
</template>
最佳实践
1. 表单验证
结合 Element Plus 的表单验证:
vue
<template>
<el-form :model="form" :rules="rules" ref="formRef">
<AFormInput
v-model="form.email"
label="邮箱"
prop="email"
type="email"
/>
</el-form>
</template>
<script setup>
const rules = {
email: [
{ required: true, message: '请输入邮箱' },
{ type: 'email', message: '请输入正确的邮箱格式' }
]
}
</script>
2. 响应式布局
根据屏幕尺寸调整布局:
vue
<template>
<el-row :gutter="20">
<AFormInput
v-model="form.name"
label="姓名"
:span="isTablet ? 12 : 24"
/>
</el-row>
</template>
<script setup>
import { useBreakpoint } from '@/composables/useBreakpoint'
const { isTablet } = useBreakpoint()
</script>
3. 动态表单
根据条件动态显示表单项:
vue
<template>
<AFormSelect
v-model="form.type"
:options="typeOptions"
label="类型"
@change="handleTypeChange"
/>
<AFormInput
v-if="form.type === 'custom'"
v-model="form.customValue"
label="自定义值"
/>
</template>
组件依赖
所有表单组件都依赖以下库:
- Vue 3.x - 核心框架
- Element Plus - UI 组件库
- @vueuse/core - 工具函数库
部分组件有额外依赖:
- AFormEditor - 依赖
@wangeditor/editor @wangeditor/editor-for-vue
富文本编辑器 - AFormCascader - 可选依赖
element-china-area-data
地区数据 - AFormFileUpload / AFormImgUpload - 需要配置 OSS 上传服务