vue element-plus表单验证

笔者的版本为"element-plus": "^2.9.3", vue": "^3.2.13" 具体的验证方法应该参考官网

[官网组件总览](https://element-plus.org/zh-CN/component/overview)

官网提供了很多的案例,每个哪里都有示例代码,直接抄就行了

[另外参考](https://blog.youkuaiyun.com/ymzhaobth/article/details/120820053)

1. 编写验证规则

const registerDataRules = reactive({

username: [

{ required: true, message: '请输入用户名', trigger: 'blur' },

{ min: 1, max: 16, message: '用户名的长度必须为5~16位', trigger: 'blur' }

],

password: [

{ required: true, message: '请输入密码', trigger: 'blur' },

{ min: 6, max: 16, message: '密码长度必须为6~16位', trigger: 'blur' }

],

rePassword: [

{ validator: rePasswordValid, trigger: 'blur' }

],

email:[

{ required: true, message: '请输入邮箱', trigger: 'blur' },

{ min: 8, max: 16, message: '必须输入邮箱格式', trigger: 'blur', type: 'email' }

],

verifyCode:[

{ required: true, message: '请输入验证码', trigger: 'blur' },

{ min: 8, max: 8, message: '验证码长度必须为8位', trigger: 'blur' }

]

})

2. 基于ref方法获取到表单项目

const ruleFormRef = ref(); // 获取表单 必须要获取表单才能实现基于非同步的验证

3. 在业务代码中验证

调用获取表单对象的.value.validate方法可以对所有的东西进行验证 如果验证失败会异常 注意这是一个异步函数要await

在位置1和位置2都能写业务代码 在位置2写业务代码可以不写await 但是在位置1必须写await否则不会等验证代码就执行了

例子:

在按钮按动发送请求前验证:


const register = async () => {

try {

//调用表单的validate方法,执行表单校验

await ruleFormRef.value.validate((valid, fields) => {

if (valid) {

console.log('submit!') // 位置2

} else {

console.log('error submit!', fields)

})



}catch(e) {

return

}

// 位置1

let data = registerData.value

let result = await userRegisterService(data);

ElMessage.success(result.message||"注册成功");

setTimeout(()=>{ //设置延时

isRegister.value = true

}, 1000);



}

4. 如果不在函数中验证 也会直接跳过验证 直接发送请求

5. 验证随意一项:如果你不想验证所有的 可以使用这个函数:validateField

const verify = async () =>{

try {

//调用表单的validate方法,执行表单校验

await ruleFormRef.value.validateField("email",()=>{//写法和前面的一样})

}catch(e) {

return

}

let data = registerData.value.email

let result = await userVerifyService(data)

ElMessage.success(result.message||"验证成功");

}
### Vue Element-Plus 实现场景下的表单字段名称唯一性校验 在构建复杂的动态表单时,确保字段名称的唯一性是一个常见的需求。为了实现在 Vue 3 和 Element Plus 中的表单字段名称唯一性校验,可以采用自定义验证规则的方式。 #### 自定义验证函数设计 创建一个用于检查字段名是否唯一的验证器函数,在该函数内部遍历当前所有的字段并判断新添加或修改后的字段名字是否存在重复情况: ```javascript // 定义全局变量存储已存在的字段名称列表 let existingFieldNames = []; const validateUniqueFieldName = (rule, value, callback) => { if (!value || !existingFieldNames.includes(value)) { // 如果为空则允许;如果不存在于现有集合内也视为合法 return callback(); } const index = rule.fullField.split('.').pop(); // 获取当前项索引 // 排除自身比较 let filteredList = [...existingFieldNames]; if(index !== undefined && Number.isInteger(Number(index))){ filteredList.splice(index, 1); } if(filteredList.includes(value)){ return callback(new Error('此字段名称已经存在')); }else{ return callback(); } }; ``` #### 将其集成至表单配置中 当初始化表单或者新增/编辑某个特定条目时更新 `existingFieldNames` 数组,并将其作为参数传递给对应的 rules 属性下指定字段的验证逻辑里去[^1]。 ```html <template> <el-form :model="dynamicForm" :rules="formRules"> <!-- 动态渲染表单项 --> <div v-for="(field, idx) in dynamicForm.fields" :key="idx"> <el-input v-model="field.name" placeholder="请输入字段名称" @change="updateExistingFieldNames(idx)"> </el-input> ... </div> <el-button type="primary" @click="submitForm">提交</el-button> </el-form> </template> <script setup lang="ts"> import { ref, reactive, onMounted} from 'vue'; const dynamicForm = reactive({ fields: [ { name: '' }, // 更多初始字段... ] }); onMounted(() => { updateExistingFieldNames(-1); // 初始化加载已有数据到 existingFieldNames }) function submitForm() {} function updateExistingFieldNames(currentIndex?: number){ existingFieldNames = dynamicForm.fields.map((item,idx)=>{ if(typeof currentIndex ==='number'&&currentIndex===idx)return ''; return item.name; }).filter(Boolean); formRules.fieldName.rules.push({ validator:validateUniqueFieldName }); } </script> ``` 上述代码片段展示了如何利用事件监听机制(`@change`)来实时同步最新的字段名称状态,并且每当发生变更都会触发一次重新计算以保持最新版本的数据一致性[^2]。 #### 关键点说明 - **双向绑定**:每个字段通过 `v-model` 双向绑定到了相应的对象属性上。 - **动态生成字段**:使用 `v-for` 来循环展示可变数量的表单项。 - **表单校验**:对于静态和动态产生的项目分别设置了固定的以及依据条件变化而调整的不同类型的检验规则。 - **删除功能**:确保每次操作都能正确反映到实际显示的内容之中。 - **状态管理**:借助 `reactive()` 函数配合侦听器 (`watch`) 达成对整个表单结构及其子元素变动的高度敏感响应能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值