1270 字
6 分钟
Element Plus 表单创建与 v-model 用法指南
Element Plus 表单创建与 v-model 用法指南
一、Element Plus 表单基础结构
1. 基本表单框架
<template> <el-form :model="formData" label-width="100px" size="large"> <!-- 表单项 --> </el-form></template>
<script setup>import { reactive } from 'vue'
// 表单数据模型const formData = reactive({ // 表单字段})</script>2. 核心属性
:model:绑定表单数据对象label-width:标签宽度size:表单尺寸(large/medium/small)rules:表单验证规则
二、常用表单项组件
1. 输入框(Input)
<el-form-item label="用户名:" required> <el-input v-model="formData.username" placeholder="请输入用户名"></el-input></el-form-item>2. 下拉选择器(Select)
<el-form-item label="性别:" required> <el-select v-model="formData.gender" placeholder="请选择"> <el-option label="男" value="male"></el-option> <el-option label="女" value="female"></el-option> </el-select></el-form-item>多选模式
<el-form-item label="爱好:"> <el-select v-model="formData.hobbies" placeholder="请选择" multiple> <el-option label="阅读" value="reading"></el-option> <el-option label="运动" value="sports"></el-option> <el-option label="音乐" value="music"></el-option> </el-select></el-form-item>3. 单选框(Radio)
<el-form-item label="状态:"> <el-radio-group v-model="formData.status"> <el-radio label="active">启用</el-radio> <el-radio label="inactive">停用</el-radio> </el-radio-group></el-form-item>4. 复选框(Checkbox)
<el-form-item label="角色:"> <el-checkbox-group v-model="formData.roles"> <el-checkbox label="admin">管理员</el-checkbox> <el-checkbox label="user">普通用户</el-checkbox> </el-checkbox-group></el-form-item>5. 日期时间选择器
<!-- 日期选择 --><el-form-item label="出生日期:"> <el-date-picker v-model="formData.birthday" type="date" placeholder="选择日期"></el-date-picker></el-form-item>
<!-- 时间范围 --><el-form-item label="开放时间:"> <el-time-picker v-model="formData.startTime" format="HH:mm" placeholder="开始时间"></el-time-picker> <span>~</span> <el-time-picker v-model="formData.endTime" format="HH:mm" placeholder="结束时间"></el-time-picker></el-form-item>6. 文本域(Textarea)
<el-form-item label="简介:"> <el-input v-model="formData.intro" type="textarea" placeholder="请输入简介" rows="3" ></el-input></el-form-item>7. 图片上传
<el-form-item label="头像:"> <el-upload class="avatar-uploader" :show-file-list="false" action="#" :before-upload="() => false" > <img v-if="formData.avatar" :src="formData.avatar" class="avatar" /> <div v-else class="el-upload__text">+ 上传</div> </el-upload></el-form-item>三、v-model 用法详解
1. 基本概念
v-model 是 Vue 的双向绑定指令,用于在表单控件和数据模型之间建立双向数据流。
2. 语法格式
<el-input v-model="formData.fieldName" placeholder="请输入"></el-input>3. 工作原理
- 当用户在表单控件中输入内容时,v-model 会自动更新绑定的数据模型
- 当数据模型发生变化时,v-model 会自动更新表单控件的显示
4. 支持的数据类型
| 表单控件类型 | 支持的数据类型 | 示例 |
|---|---|---|
| Input/Textarea | String/Number | v-model="formData.name" |
| Select(单选) | String/Number/Boolean | v-model="formData.gender" |
| Select(多选) | Array | v-model="formData.hobbies" |
| Radio | String/Number/Boolean | v-model="formData.status" |
| Checkbox(单选) | Boolean | v-model="formData.agree" |
| Checkbox(多选) | Array | v-model="formData.roles" |
| Date/Time Picker | Date/String | v-model="formData.birthday" |
5. 修饰符
.number
将输入值转换为数字类型
<el-input v-model.number="formData.age" placeholder="请输入年龄"></el-input>.trim
自动去除输入值的首尾空格
<el-input v-model.trim="formData.username" placeholder="请输入用户名"></el-input>.lazy
在 change 事件触发时更新数据(默认是 input 事件)
<el-input v-model.lazy="formData.content" placeholder="请输入内容"></el-input>四、表单布局
1. 行内布局
<el-row :gutter="16"> <el-col :sm="12" :xs="24"> <!-- 表单项 --> </el-col> <el-col :sm="12" :xs="24"> <!-- 表单项 --> </el-col></el-row>2. 表单分组
<h3 style="margin: 20px 0 15px;">基本信息</h3><!-- 相关表单项 -->
<h3 style="margin: 20px 0 15px;">高级设置</h3><!-- 相关表单项 -->五、表单验证
1. 定义验证规则
<el-form :model="formData" :rules="formRules" label-width="100px"> <!-- 表单项 --></el-form>
<script setup>import { reactive } from 'vue'
const formData = reactive({ /* 表单数据 */ })
// 验证规则const formRules = reactive({ username: [ { required: true, message: '请输入用户名', trigger: 'blur' }, { min: 3, max: 20, message: '长度在 3 到 20 个字符', trigger: 'blur' } ]})</script>2. 手动触发表单验证
<el-form ref="formRef" :model="formData" :rules="formRules"> <!-- 表单项 --> <el-button type="primary" @click="submitForm">提交</el-button></el-form>
<script setup>import { reactive, ref } from 'vue'
const formRef = ref(null)const formData = reactive({ /* 表单数据 */ })const formRules = reactive({ /* 验证规则 */ })
// 提交表单const submitForm = () => { formRef.value.validate((valid) => { if (valid) { // 验证通过,处理表单提交 } })}</script>六、最佳实践
1. 表单数据模型设计
// 推荐使用 reactive 创建表单数据const formData = reactive({ basic: { // 基本信息字段 }, advanced: { // 高级设置字段 }})2. 代码组织
<template> <!-- 表单结构 --></template>
<script setup>// 1. 导入依赖// 2. 定义表单数据// 3. 定义验证规则// 4. 定义表单方法// 5. 定义生命周期钩子</script>
<style scoped>/* 表单样式 */</style>3. 性能优化
- 避免不必要的 v-model 绑定
- 合理使用 lazy 修饰符
- 对于大数据量的表单,考虑使用虚拟列表
七、常见问题与解决方案
1. 多选框无法显示所有选择项
问题:使用 collapse-tags 属性导致选中项被折叠
解决方案:移除 collapse-tags 属性
<!-- 错误 --><el-select v-model="formData.tags" multiple collapse-tags> <!-- 选项 --></el-select>
<!-- 正确 --><el-select v-model="formData.tags" multiple> <!-- 选项 --></el-select>2. 表单提交后数据不更新
问题:表单数据对象没有使用 reactive 或 ref 包装 解决方案:确保使用 Vue 的响应式 API 包装表单数据
// 正确做法const formData = reactive({ // 表单字段})3. 下拉选择器默认值不显示
问题:v-model 绑定的值与选项的 value 类型不匹配 解决方案:确保绑定值与选项 value 类型一致
// 选项 value 是字符串类型<el-option label="选项1" value="1"></el-option>
// 绑定值也应该是字符串类型const formData = reactive({ option: '1' // 而不是数字 1})八、总结
Element Plus 表单创建与 v-model 使用的核心要点:
- 表单结构:使用
el-form作为容器,:model绑定数据 - 表单项:根据需求选择合适的表单组件
- v-model:实现表单控件与数据的双向绑定
- 布局:使用
el-row和el-col实现灵活的表单布局 - 验证:通过
rules属性定义表单验证规则 - 最佳实践:合理组织代码,优化性能
参考资料:
Element Plus 表单创建与 v-model 用法指南
https://yukilain.com/posts/element-plus-form-vmodel-guide/ 部分信息可能已经过时




