0


element-plus el-form 表单、表单验证 使用方法、注意事项

element-plus@2.0.6 及之后的版本,表单验证不再是同步执行的了

另外,element-plus@2.1.4 及之后的版本,才可按照官方文档示例正常使用(使用的是两者的中间版本的话,最好先自行确认下正确的

const submitForm = async (formEl: FormInstance | undefined) => {
  if (!formEl) return
  await formEl.validate((valid, fields) => {
    if (valid) {
      console.log('submit!') // 位置1
    } else {
      console.log('error submit!', fields)
    }
  })
  // 位置2
}

上例中:

如果在“位置1”执行表单验证通过后的业务代码,可以去掉 async...await

如果在“位置2”执行,则需加上。否则,会直接跳过验证

这样,与异步校验(三、6)的使用办法就一致了,两者可以取其一。element-plus@2.1.4及之后的推荐统一使用上例中的写法


表单定义规则

//表单验证规则 
const rules = reactive({
  name: [{ validator: checkName, trigger: ['blur', 'change'],required: true}],
  phone: [{ type: number, validator: checkPhone, trigger: ['blur', 'change'] }],
  password: [{ validator: checkpassword, trigger: ['blur'] }],
})

el-form配置

<el-form :model="formData" :rules="rules" ref="baseForm"></el-form>

上一步已经为表单绑定了规则列表formData,接下来,只需要在form-item中使用prop绑定验证规则即可

<el-form-item label="电话" style="width: 40%" prop="phone">
   <el-input v-model="formData.phone" type="text" autocomplete="off" disabled />
</el-form-item>

对应关系:

表单对象 formData: { name: '' }

表单元素 prop="name"

规则列表 rules: { name: [{...}] }

另外,验证嵌套属性可以通过 . 连接绑定:

formData: { obj: { name: '' } }

prop="obj.name"

baseRules: { 'obj.name': [{...}] }

完整demo

<template>
    <el-form :model="formData" :rules="rules" ref="ruleFormRef" status-icon label-width="120px" size="large">
        <el-form-item label="姓名" style="width: 40%" prop="name">
          <el-input v-model="form.name" type="text" autocomplete="off" />
        </el-form-item>
        <el-form-item label="性别" style="width: 40%" prop="sex">
          <el-select v-model="form.sex" placeholder="请选择性别">
            <el-option label="男" :value=1 />
            <el-option label="女" :value=0 />
          </el-select>
        </el-form-item>
        <el-form-item label="生日" style="width: 40%" prop="birthday">
          <!-- <el-input v-model="form.birthday" type="text" autocomplete="off" /> -->
          <el-date-picker v-model="form.birthday" type="date" placeholder="请选择生日!" style="width: 100%"
            value-format="YYYY-MM-DD" />
        </el-form-item>
        <el-form-item label="电话" style="width: 40%" prop="phone">
          <el-input v-model="form.phone" type="text" autocomplete="off" disabled />
        </el-form-item>
        <el-form-item label="密码" style="width: 40%" prop="password">
          <el-input v-model="form.password" type="password" autocomplete="off" show-password />
        </el-form-item>
      </el-form>
</template>

<script setup>
let formData = reactive({
  birthday: '',
  name: '',
  phone: '',
  sex: 1,
  password: ''
})
// 验证函数
const checkPhone = (rule, value, callback) => {
  console.log(value);
  if (!Number.isInteger(Number(value))) {
    return callback(new Error('请输入数字!'))
  } else if (String(value).length != 11) {
    return callback(new Error('您输入的手机位数不是11位!'))
  } else {
    callback()
  }
}
// 验证函数
const checkpassword = (rule, value, callback) => {
  console.log(value);
  if (String(value).length > 12) {
    return callback(new Error('您输入的密码过长!长度不超过12位'))
  } else {
    callback()
  }
}
// 验证函数
const checkName = (rule, value, callback) => {
  if (value.length > 8) {
    return callback(new Error('您输入的姓名过长!'))
  } else {
    callback()
  }
}
//表单验证规则 
const rules = reactive({
  name: [{ validator: checkName, trigger: ['blur', 'change'] }],
  phone: [{ type: number, validator: checkPhone, trigger: ['blur', 'change'] }],
  password: [{ validator: checkpassword, trigger: ['blur'] }],
})

</script>

配置项以及其可选的值(详细文档链接)

Rules API:
  1. type: 指示要使用的验证器类型

type: string, number, boolean, method, regexp, integer, float, array, object, enum, date, url, hex, email, any

  1. Required

required:必填/非必填

  1. Messages

message: 错误提示

  1. Pattern

pattern: 值需校验通过的正则表达式

  1. Range

min, max: type为array, string时,指长度。为number时,指大小

  1. Length

len: type为array, string时,指长度。为number时,指值

  1. Enumerable

enum: 例:{ type: 'enum', enum: ['admin', 'user', 'guest'] }

  1. Whitespace

  2. Deep Rules 对象的深层规则

fields: 对象的属性名,数组的下标

defaultField: 应用于对象、数组内的所有成员

  1. Transform

transform: 方法,对值的预处理

  1. validator

validator: 自定义验证方法

  1. asyncValidator

asyncValidator: 自定义异步验证方法

trigger: 触发验证的方法,值可用字符串’blur’, ‘change’,也可是数组[‘blur’, ‘change’]

注意,规则数组是按序逐一被执行验证的(trigger='blur’时,更改input框的值不会触发验证)

进阶

1、单项验证

可在表单的项 ( < el-form-item > ) 中单独设置验证规则

<el-form-item label="邮箱:" prop="email"
  :rules="[{ type: 'email', message: '邮箱格式错误', trigger: 'change' }]"
></el-form-item>

简写:

<el-form-item label="姓名:" prop="username" required />

对于字符串的非空校验,element plus表单验证提供了一种简单的方式(能实现校验,但有很大局限性,而且提示语是英文)


为了代码的可维护性与美观,尽量不要将规则写在模板中。但某些情况下必须如此,比如,当需要额外传递参数给validator时:

<el-form-item label="样本类型:" prop="sampType"
    :rules="[{ validator: (rule, value, cb) => validateSampType(rule, value, cb, yourParams), trigger: 'change' }]"
></el-form-item>

正则校验

//regex.js
// 手机号或座机号
export const reg_tel_phone = /(^((\+86)|(86))?(1[3-9])\d{9}$)|(^(0\d{2,3})-?(\d{7,8})$)/
//doctor.vue
import { reg_tel_phone } from '@/assets/regex'
rules: {
  name: [{ required: true, message: '请输入医生名称', trigger: 'blur' }],
  title: [{ required: true, message: '请选择职称', trigger: 'change' }],
  tel: [{ pattern: reg_tel_phone, message: '请输入正确的手机号或座机号', trigger: ['blur', 'change'] }]
},

注意:直接在vue模板中进行单项验证使用正则校验时,需将RegExp定义成响应式变量。


本文转载自: https://blog.csdn.net/m0_57033755/article/details/129197894
版权归原作者 柑橘乌云_ 所有, 如有侵权,请联系我们删除。

“element-plus el-form 表单、表单验证 使用方法、注意事项”的评论:

还没有评论