element ui表单验证原理

1.获取用户传的rules进行验证,主要是安装了async-validator插件。
2.点击提交按钮验证所有表单,主要是触发了父组件el-form的validate,validate会查找所有el-form-item,然后调用el-form-item的validate。
el-form.vue

methods:{
        validate(cb){
            let r = this.$broadcast('elFormItem').every(item=>item.validate());
            cb(r)
        }
    }

broadcast的写法

Vue.prototype.$broadcast = function(componentName, name) {
    let children = this.$children; // 子组件
    let arr = [];
    function find(children) {
        children.forEach(child => {
            if (child.$options.name == componentName) {
                arr.push(child);
                if(name){
                  child.$emit(name)
                }
            }
            if (child.$children) {
                find(child.$children);
            }
        })
    }
    find(children);
    return arr
}

3.通过rules里设置的trigger去触发验证的话,实际上是靠子组件,比如el-input进行发布订阅。然后触发el-form-item的validate
el-input.vue

<template>
  <input type="text" :value="value" @input="handleInput" />
</template>

<script>
export default {
  name: "elInput",
  props: {
    value: String,
  },
  methods: {
    handleInput(e) {
        this.$emit('input',e.target.value)
        this.$dispatch('elFormItem','changeValue');
    },
  },
};
</script>

el-form-item.vue

 mounted() {
    this.$on("changeValue", () => {
      // 需要获取最新的值检测是否合法, 去全部数据中通过prop进行查找
      this.validate();
    });
  }

dispatch的写法

// 告诉组件触发自己身上的哪个方法
Vue.prototype.$dispatch = function(componentName, name) {
    let parent = this.$parent; // 父组件 不能是原生dom
    while (parent) {
        if (componentName == parent.$options.name) {
            break;
        } else {
            parent = parent.$parent;
        }
    }
    if (parent && name) {
        parent.$emit(name)
    }
    return parent;
};
Element UI 提供了一套简洁易用的表单验证组件,允许开发者方便地集成到项目中。它基于 Vue.js,并提供了一系列预设的验证规则和提示,可以轻松实现如必填项、邮箱格式、手机号码验证等功能。以下是Element UI 表单验证的一些关键特性: 1. **内置验证规则**:比如 `required`(必填)、`email`(邮箱)、`number`(数字)等,可以直接应用于 `<el-form-item>` 的 `rules` 属性。 2. **自定义验证**:允许设置复杂的正则表达式或自定义函数进行更精细的验证。 3. **实时验证**:提交按钮按下时会立即触发验证,错误会在对应的输入框显示提示。 4. **验证状态**:通过 `error` 或 `success` 类名展示验证结果,易于视觉反馈。 5. **组件级验证**:不仅限于整个表单,每个单独的表单项也可以独立进行验证。 6. **验证状态管理**:支持全局验证状态统一管理和控制,便于处理复杂场景。 使用示例: ```html <template> <el-form :model="form" ref="ruleForm" label-width="80px"> <!-- ... --> <el-form-item prop="password" label="密码" rules="required"> <el-input type="password"></el-input> </el-form-item> </el-form> </template> <script> export default { data() { return { form: { password: '' } }; }, methods: { submitForm() { this.$refs.ruleForm.validate((valid) => { if (valid) { console.log('submit!'); } else { console.log('error submitting!'); } }); } } }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值