复杂的官方文档
大家好,编写elementUI时,看到新的element-plus的表单验证部分写的如此的复杂,我下面复制官方文档的表单验证部分的代码。
<template> <el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="120px" class="demo-ruleForm" :size="formSize" > <el-form-item label="Activity name" prop="name"> <el-input v-model="ruleForm.name" /> </el-form-item> <el-form-item label="Activity zone" prop="region"> <el-select v-model="ruleForm.region" placeholder="Activity zone"> <el-option label="Zone one" value="shanghai" /> <el-option label="Zone two" value="beijing" /> </el-select> </el-form-item> <el-form-item label="Activity time" required> <el-col :span="11"> <el-form-item prop="date1"> <el-date-picker v-model="ruleForm.date1" type="date" placeholder="Pick a date" style="width: 100%" /> </el-form-item> </el-col> <el-col class="text-center" :span="2"> <span class="text-gray-500">-</span> </el-col> <el-col :span="11"> <el-form-item prop="date2"> <el-time-picker v-model="ruleForm.date2" placeholder="Pick a time" style="width: 100%" /> </el-form-item> </el-col> </el-form-item> <el-form-item label="Instant delivery" prop="delivery"> <el-switch v-model="ruleForm.delivery" /> </el-form-item> <el-form-item label="Activity type" prop="type"> <el-checkbox-group v-model="ruleForm.type"> <el-checkbox label="Online activities" name="type" /> <el-checkbox label="Promotion activities" name="type" /> <el-checkbox label="Offline activities" name="type" /> <el-checkbox label="Simple brand exposure" name="type" /> </el-checkbox-group> </el-form-item> <el-form-item label="Resources" prop="resource"> <el-radio-group v-model="ruleForm.resource"> <el-radio label="Sponsorship" /> <el-radio label="Venue" /> </el-radio-group> </el-form-item> <el-form-item label="Activity form" prop="desc"> <el-input v-model="ruleForm.desc" type="textarea" /> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm(ruleFormRef)" >Create</el-button > <el-button @click="resetForm(ruleFormRef)">Reset</el-button> </el-form-item> </el-form> </template> <script lang="ts" setup> import { reactive, ref } from 'vue' import type { FormInstance, FormRules } from 'element-plus' const formSize = ref('default') const ruleFormRef = ref<FormInstance>() const ruleForm = reactive({ name: 'Hello', region: '', date1: '', date2: '', delivery: false, type: [], resource: '', desc: '', }) const rules = reactive<FormRules>({ name: [ { required: true, message: 'Please input Activity name', trigger: 'blur' }, { min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' }, ], region: [ { required: true, message: 'Please select Activity zone', trigger: 'change', }, ], date1: [ { type: 'date', required: true, message: 'Please pick a date', trigger: 'change', }, ], date2: [ { type: 'date', required: true, message: 'Please pick a time', trigger: 'change', }, ], type: [ { type: 'array', required: true, message: 'Please select at least one activity type', trigger: 'change', }, ], resource: [ { required: true, message: 'Please select activity resource', trigger: 'change', }, ], desc: [ { required: true, message: 'Please input activity form', trigger: 'blur' }, ], }) const submitForm = async (formEl: FormInstance | undefined) => { if (!formEl) return await formEl.validate((valid, fields) => { if (valid) { console.log('submit!') } else { console.log('error submit!', fields) } }) } const resetForm = (formEl: FormInstance | undefined) => { if (!formEl) return formEl.resetFields() } </script>
一个简单的表单验证写的这么啰嗦,我就想校验一下登录账号和密码,需要这么麻烦吗?
其实只需要FormInstance就可以实现了。
超简单的写法
对于简单的表单验证,完全不需要上面那么啰嗦。
其实验证是很简单的,只需要写一个验证的数组(rules),并赋值给el-form组件的rule参数即可,如下
<el-form ref="formRef" :model="loginForm" :rules="rules" label-position="top"></el-form>
rules长这样
const rules = ref({ phone: [ {required: true, message: '必须输入手机号码', trigger: 'blur'}, {pattern: /^1[3456789]\d{9}$/, message: '手机号码格式不正确', trigger: 'blur'}, ], password: [ {required: true, message: '必须输入密码', trigger: 'blur'}, {min: 6, max: 20, message: '密码长度在 6 到 20 个字符', trigger: 'blur'}, ] })
那你可能会问了,ref是干啥用的啊?
告诉你,ref的目的是为了在提交或者什么操作的时候,手动验证表单,如下。
比如我们有个登录按钮,和登录的方法onLogin()
<el-button type="primary" @click="onLogin(formRef)">登录</el-button>
const onLogin = (form) => { form.validate((valid, fields) => { if (valid) { console.log('登录成功') } else { console.log('error submit!', fields) } }) }
相信小伙伴们已经看明白什么意思了。
简单来说,就是在登录方法里传参传这个ref进去,然后这个ref有validate()方法,通过这个方法就校验了。上面的if else是固定写法。
那么ref这个值是哪来的呢?其实是开头说的FormInstance定义出来的,定义如下:
// 引用 import {FormInstance} from "element-plus" // 这个是写在setup()里的!! const formRef = ref<FormInstance>('')
怎么样,是不是比官方那啰里啰嗦一大串舒服多了?
发表回复