Vue3+element-plus项目开发小结(validate)

本文总结了在Vue3项目中使用Element-Plus进行表单验证的经验,强调了父子组件间的交互。通过设置ref实例确保子组件非空,并在父组件的dialog弹窗中嵌套子组件表单。表单校验规则通过`:rules`绑定,并需注册`FormRules`和`FormInstance`。自定义校验可通过`validator`实现。错误示例中,由于误用`v-model`代替`:model`,导致父子组件双向数据绑定失效。正确理解v-model和:model的区别对于父子组件嵌套至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 表单校验的绑定(父子组件嵌套)

 这里的ref实例对象是确保子组件ref="metaTagForm"不能为空值设立的。

父组件为dialog弹窗

 子组件是嵌套其中的form表单

vue3的表单校验和vue2的大差不差,

首先 :rules="rules" 为表单绑定规则,然后rules声明之后为标注了prop类型的formitem进行配对设置校验

这里需要注意的是vue3需要额外注册 FormRules,FormInstance

一个是为了使用ele的校验功能,一个则是将 form的校验绑定到该form的ref实例对象上,方便父组件获取。

如若需要自定义校验,和vue2一样使用 validator: validateType,

ps:图中还有显示<MetaTag>是因为搭配了TS type,里面对数据进行了规定类型操作。

其实按照图上的流程走是表单校验没有问题的!

但是问题出在笔者一开始犯了一个小错误,将子组件的 :model写成了v-model,这样就会导致父子组件无法双向数据绑定。

v-model是用于实现表单元素与Vue实例中数据的双向绑定,而:model是用于将Vue实例中的数据属性绑定到HTML元素的某个属性上。

可以换句话描述就是v-model等于线对面,而:model等于点对线。涉及到父子组件嵌套,不能全都使用v-model!!

### 完整 Vue3Element Plus 组合的前端项目示例 #### 项目概述 `vue-element-plus-admin` 是一个基于 Vue3Element Plus 及其他现代前端技术构建的后台管理系统模板。这套模板不仅集成了 Vue3Element Plus,还融合了 TypeScript 提供类型安全性以及 Vite 实现快速开发环境[^4]。 #### 技术栈详情 - **框架**: Vue3 - 当前版本的渐进式 JavaScript 框架。 - **UI库**: Element Plus - 高效且美观的企业级 UI 库。 - **打包工具**: Vite2 - 下一代前端构建工具,提供极快的冷启动速度和服务时间。 - **状态管理**: Pinia - 轻量的状态管理模式与库。 - **IDE 支持**: Volar - 更好的 VSCode 插件支持 Vue3 的语法特性。 - **路由处理**: Vue Router - 正式的 Vue.js 单页面应用 (SPA) 官方路由器[^1]。 #### 主要特点 - **现代化的技术选型**:采用最新的前端技术和最佳实践,确保项目的先进性和可维护性。 - **开箱即用的功能模块**:内置多种实用功能,减少重复劳动,提高开发效率。 - **响应式设计**:适配不同尺寸屏幕,满足多终端访问需求。 - **国际化支持**:方便实现多语言切换,适用于全球市场部署。 - **权限控制机制**:灵活的角色权限配置,保障数据安全[^5]。 #### 示例代码片段展示登录界面逻辑 ```typescript // src/views/Login.vue <template> <el-form :model="loginForm" status-icon :rules="rules" ref="ruleFormRef"> <!-- 用户名输入框 --> <el-form-item prop="username"> <el-input v-model="loginForm.username"></el-input> </el-form-item> <!-- 密码输入框 --> <el-form-item prop="password"> <el-input type="password" v-model="loginForm.password"></el-input> </el-form-item> <!-- 登录按钮 --> <el-button @click="submitForm(ruleFormRef)">Login</el-button> </el-form> </template> <script setup lang="ts"> import { reactive, ref } from &#39;vue&#39; import type { FormInstance } from &#39;element-plus&#39; const ruleFormRef = ref<FormInstance>() const loginForm = reactive({ username: &#39;&#39;, password: &#39;&#39; }) const rules = { username: [{ required: true, message: &#39;Please input Username&#39;, trigger: &#39;blur&#39; }], password: [{ required: true, message: &#39;Please input Password&#39;, trigger: &#39;change&#39; }] } function submitForm(formEl: FormInstance | undefined): void { if (!formEl) return; formEl.validate((valid) => { if (valid) console.log(&#39;submit!&#39;); else console.log(&#39;error submit!!&#39;); }) } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值