el-from 使用 rules自定义表单验证规则

本文详细介绍了如何在Vue应用中使用ElementUI的el-form组件,特别是当数据关联到:model时,以及如何设置自定义校验规则,如required、message和trigger。还讨论了验证函数的实现和不同类型的验证规则设置。

 el-from 内使用的数据需使用 :model 相关联的值方可正常使用,关联值为数组状态 :rules="clientFormRules"  指明了校验规则使用rules规则对象,名称自定义;prop项,指明哪些字段可能使用校验规则

<el-form id="clientForm" ref="client" :model="clientForm" :rules="clientFormRules" label-width="110px" label-position="left">
          <el-card class="box-card" shadow="hover">
            <el-row>
              <el-col :span="8">
                <el-form-item label="名称" prop="titleValue">
                  <el-input v-model="clientForm.titleValue" maxlength="50" :disabled="false" />
                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="24">
                <el-form-item label="简介" prop="contentValue">
                  <el-input v-model="clientForm.contentValue" maxlength="500" type="textarea" :autosize="{ minRows: 2, maxRows: 20}" :disabled="false" />
                </el-form-item>
              </el-col>
            </el-row>
          </el-card>
        </el-form>

clentFrom为 :model 相关联的数组定义在data(return{})内,其名称必须与form的:rules属性绑定的rules规则对象名一致,clientFromRules 为定义相关的规则定义在data()内

  data() {
    var checkTitle = (rule, value, callback) => {
      if (!value) {
        return callback(new Error('名称为空'))
      } else {
        callback()
      }
    }
    var checkContent = (rule, value, callback) => {
      if (!value) {
        return callback(new Error('简介为空'))
      } else {
        callback()
      }
    }
    return {
      loading: false,
      publish_note: false,
      activeButton: '保存',
      title: '新增',
      table_loading: false,
      maxTableHeight: '650px',
      tableData: [],
      selectedContent: [],
      total: 0,
      pageSize: 10,
      currentPage: 1,
      clientForm: {
        titleValue: '',
        contentValue: ''
      },
      clientFormRules: {
        titleValue: [{
          required: true,
          validator: checkTitle,
          trigger: 'blur'
        }],
        contentValue: [{
          required: true,
          validator: checkContent,
          trigger: 'blur'
        }]
      }
    }
  },

rule项

rule项,即规则数组的元素,这是本文要重点探讨的项目。这里先就上述rules的各元素项解析一下:

  • required:表示是否必须有值,取值为true/false,如为true,表示必须有值,如果无值,则校验不通过;如为false,则允许无值,但在有值的情况下,不影响其它规则的使用。
  • message:提示消息,在校验不通过时提示此消息。
  • trigger:触发方式,取值为blur/change,blue表示失去焦点,一般在input组件中使用;change为值改变,一般在选择框中使用。
  • min:字符串最小长度。
  • max:字符串最大长度。

validate 任一表单项被校验后触发,后跟自定规则 validator: checkContent 规则定义在data内,不论结果是否正确都要执行 callback()

var checkContent = (rule, value, callback) => {
      if (!value) {
        return callback(new Error('掲載強化文言を入力してください。'))
      } else {
        callback()
      }
    }
Type 内置类型(定义在prop关联的数据内,非定义类型的数据就会报错)
  • string: 必须是 stringThis is the default type.
  • number: 必须是 number.
  • boolean: 必须是 boolean.
  • method: 必须是 function.
  • regexp: 必须是正则或者是在调用 new RegExp 时不报错的字符串.
  • integer: 整数.
  • float: 浮点数.
  • array: 必须是数组,通过 Array.isArray 判断.
  • object: 是对象且不为数组.
  • enum: 值必须出现在 enmu 枚举值中.
  • date: 合法的日期,使用 Date 判断
  • url: url.
  • hex: 16进制.
  • email: 邮箱地址.
contentValue: [{
  type: "string", 
  required: true,
  validator: checkContent,
  trigger: 'blur'
}]

<think>我们正在讨论Vue 3中Element Plus(原Element UI)的el-form组件的自定义校验规则实现方法。根据提供的引用内容,我们可以总结如下: 1. 基本校验规则:在rules对象中定义每个表单项的校验规则数组,每个规则是一个对象,可以包含required、min、max等内置规则,以及自定义validator函数(引用1、2)。 2. 深层结构数据校验:当表单数据为嵌套对象时,prop属性需要使用点语法(如`prop="version.bomNo"`),并在rules中定义对应的规则(引用3)。 3. 自定义校验函数:在规则对象中使用validator属性,该属性是一个函数,接收三个参数:rule(当前规则)、value(当前表单项的值)、callback(回调函数)。在自定义校验函数中,我们可以编写逻辑,并在验证完成后调用callback。如果验证通过,调用callback();如果验证失败,调用callback(new Error('错误信息'))(引用2、4)。 4. 自定义校验函数需要传递多个参数时(例如,根据其他表单项的值进行校验),可以在validator函数中使用闭包或者箭头函数来传递额外的参数(如引用4中,传递了form.idType)。 在Vue 3中,我们可以使用Composition API或Options API来定义规则。下面我们分别展示两种方式。 ### 方式1:使用Composition API(推荐) ```html <template> <el-form :model="form" :rules="rules" ref="formRef"> <!-- 普通字段 --> <el-form-item label="活动名称" prop="name"> <el-input v-model="form.name"></el-input> </el-form-item> <!-- 嵌套字段 --> <el-form-item label="版本号" prop="version.bomNo"> <el-input v-model="form.version.bomNo"></el-input> </el-form-item> <!-- 自定义校验,同时传入其他参数 --> <el-form-item label="身份证号" prop="idNum"> <el-input v-model="form.idNum"></el-input> </el-form-item> </el-form> </template> <script setup> import { ref, reactive } from 'vue'; // 表单数据 const form = reactive({ name: '', version: { bomNo: '' }, idNum: '', idType: '身份证' // 假设还有一个证件类型字段 }); // 自定义校验函数 - 校验身份证号,根据证件类型来校验 const validateIdNum = (rule, value, callback) => { // 这里可以根据form.idType来判断 if (form.idType === '身份证') { if (!value) { callback(new Error('身份证号不能为空')); } else if (value.length !== 18) { callback(new Error('身份证号必须是18位')); } else { callback(); } } else { // 其他证件类型可能不做校验,或者不同规则 callback(); } }; // 定义规则 const rules = reactive({ name: [ { required: true, message: '请输入活动名称', trigger: 'blur' }, { min: 3, max: 5, message: '长度在3到5个字符', trigger: 'blur' } ], // 嵌套字段的规则,注意prop的路径 'version.bomNo': [ { required: true, message: '版本号不能为空', trigger: 'blur' } ], idNum: [ // 自定义校验规则 { validator: validateIdNum, trigger: 'blur' } ] }); </script> ``` ### 方式2:使用Options API ```html <template> <!-- 同上 --> </template> <script> export default { data() { return { form: { name: '', version: { bomNo: '' }, idNum: '', idType: '身份证' }, // 规则定义在data中 rules: { name: [ { required: true, message: '请输入活动名称', trigger: 'blur' }, { min: 3, max: 5, message: '长度在3到5个字符', trigger: 'blur' } ], 'version.bomNo': [ { required: true, message: '版本号不能为空', trigger: 'blur' } ], idNum: [ { validator: this.validateIdNum, trigger: 'blur' } ] } }; }, methods: { validateIdNum(rule, value, callback) { if (this.form.idType === '身份证') { if (!value) { callback(new Error('身份证号不能为空')); } else if (value.length !== 18) { callback(new Error('身份证号必须是18位')); } else { callback(); } } else { callback(); } } } }; </script> ``` ### 关键点说明 1. **自定义校验函数**:通过`validator`属性指定一个函数,该函数接收三个参数:`rule`(规则对象)、`value`(当前值)、`callback`(回调函数)。在校验函数中,根据业务逻辑进行校验,然后调用`callback`。 2. **嵌套对象校验**:在`prop`属性中使用点路径(如`version.bomNo`),并在`rules`中定义相同路径的规则。 3. **传递额外参数**:自定义校验函数内部可以访问到组件实例(在Options API中通过`this`,在Composition API中通过闭包引入的响应式变量),因此可以获取其他字段的值。 4. **异步校验**:如果需要异步校验(例如调用接口),可以在校验函数中返回一个Promise,或者使用`callback`(在异步操作完成后调用callback)。 ### 注意事项 - 自定义校验函数中,必须调用`callback`,否则校验流程会一直等待。 - 在Composition API中,如果自定义校验函数需要访问其他响应式变量,确保在函数内部使用`reactive`或`ref`创建的变量(如上面的`form`)。 - 对于复杂的表单,建议将校验规则拆分到单独的文件中,以便复用和维护。 ### 相关问题 1.Vue 3中,如何为el-form的表单字段设置必填(required)校验? 2. 自定义校验函数中如何实现异步校验(例如调用API验证用户名是否重复)? 3.Element Plus中,如何重置表单的校验状态? 4. 如何实现整个表单的自定义校验(例如确认密码和密码的一致性校验)? </think>以下是 Vue 3 中 Element Plus(原名 Element UI)表单组件 `el-form` 使用自定义校验规则 `rules` 的详细实现方法: ### 一、自定义校验核心步骤 1. **定义规则对象** 在组件 data/composition 中创建 `rules` 对象,包含自定义校验函数: ```javascript const rules = reactive({ fieldName: [ { validator: (rule, value, callback) => { // 自定义校验逻辑 if (!isValid(value)) { callback(new Error('错误提示')) } else { callback() } }, trigger: 'blur' // 或 'change' } ] }) ``` 2. **绑定到表单** 在模板中将规则绑定到表单: ```html <el-form :model="formData" :rules="rules" ref="formRef"> <el-form-item prop="fieldName" label="字段名"> <el-input v-model="formData.fieldName" /> </el-form-item> </el-form> ``` 3. **实现校验函数** 自定义校验函数需包含三个参数: - `rule`:当前规则对象 - `value`:表单项的值 - `callback`:校验结果回调函数 - 校验通过:`callback()` - 校验失败:`callback(new Error('错误信息'))` ### 二、完整代码示例(Composition API) ```html <template> <el-form :model="form" :rules="rules" ref="formRef"> <!-- 普通校验 --> <el-form-item label="活动名称" prop="name"> <el-input v-model="form.name" /> </el-form-item> <!-- 嵌套数据校验 --> <el-form-item label="产品编码" prop="product.code"> <el-input v-model="form.product.code" /> </el-form-item> <!-- 带参数的校验 --> <el-form-item label="身份证号" prop="idCard"> <el-input v-model="form.idCard" /> </el-form-item> </el-form> </template> <script setup> import { reactive, ref } from 'vue' const form = reactive({ name: '', product: { code: '' }, idCard: '', idType: '身份证' }) const rules = reactive({ // 基础校验 name: [ { required: true, message: '名称不能为空', trigger: 'blur' }, { min: 3, max: 20, message: '长度3-20字符', trigger: 'blur' } ], // 嵌套数据校验 'product.code': [{ validator: (rule, value, callback) => { if (!/^[A-Z]\d{4}$/.test(value)) { callback(new Error('格式要求: 大写字母+4位数字')) } else { callback() } }, trigger: 'blur' }], // 带参数的校验(使用闭包传参) idCard: [{ validator: (rule, value, callback) => { validateIDCard(rule, value, form.idType, callback) }, trigger: 'blur' }] }) // 自定义校验函数(可复用) const validateIDCard = (rule, value, idType, callback) => { if (idType === '身份证' && !/^\d{17}[\dX]$/.test(value)) { callback(new Error('身份证格式错误')) } else { callback() } } </script> ``` ### 三、关键要点说明 1. **嵌套数据校验** 使用**点语法**声明 prop:`prop="obj.key"` ```html <el-form-item prop="product.code">...</el-form-item> ``` ```javascript rules: { 'product.code': [{ validator: customRule }] } ``` 2. **多参数传递** 通过**闭包**传递额外参数: ```javascript { validator: (rule, value, callback) => customCheck(rule, value, extraParam, callback) } ``` 3. **异步校验** 在 validator 中返回 Promise: ```javascript { validator: (rule, value) => { return new Promise((resolve, reject) => { apiCheck(value).then(valid => { valid ? resolve() : reject(new Error('异步验证失败')) }) }) } } ``` 4. **手动触发表单校验** ```javascript const formRef = ref(null) formRef.value.validate((valid) => { if (valid) { // 提交表单 } }) ``` ### 四、注意事项 1. 确保 `el-form-item` 的 `prop` 属性与 `rules` 的键名完全匹配 2. 嵌套数据校验时,`prop` 需使用**完整路径**(如 `user.address.city`) 3. 自定义校验函数**必须执行 callback** 或返回 Promise 4. 表单重置时使用 `formRef.value.resetFields()` --- ### 相关问题 1. 如何在自定义校验规则中访问 Vue 组件实例的 data/composition 变量? 2.自定义校验需要依赖多个表单项的值时,最佳实践是什么? 3. Element Plus 的表单校验规则支持哪些内置验证类型?(如 required、pattern 等) 4. 如何实现表单提交时的全局校验与单个字段的错误聚焦? 5.Vue 3 的 Composition API 中,如何复用自定义校验函数?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值