vue element ui表单校验篇

本文讲述Vue element 关于表单校验中自定义表单校验,怎么校验表格中的表单,怎么校验表单数组循环,对象中的数据

1. 自定义验证表单中某个值

//html
<el-form :model="dataInfo" :rules="rules" ref="form"  class="demo-form" >
  <el-form-item label="名称" prop="name">
    <el-input size="small" v-model="dataInfo.name" ></el-input>
	</el-form-item>
</el-form>

//数据
data(){
  var checkName = (rule, value, callback) => {
      if (this.dataInfo.name == 'a') {
        callback(new Error("名字態为a!"));
      } else {
        callback();
      }
    };
  return {
    dataInfo: {name:''}
    rules:{
      name: [
        { required: true, message: "请输入名称", trigger: "blur" },
        { validator: checkName, trigger: "blur" }
      ],
    }
  }
}

2.验证表单对象中对象的某个属性

在vue element里,如果调用了表单的resetFields方法,这个方法可能会报一个警告(说prop期望是一个字符串得到的是一个布尔,这是element内部处理的结果),这时要用下面那个方法

//html
<el-form :model="dataInfo" :rules="rules" ref="form"  class="demo-form" >
  <el-form-item label="名称" prop="user.age">
    <el-input size="small" v-model="dataInfo.user.age" ></el-input>
	</el-form-item>
</el-form>

//数据
data(){
  var checkAge = (rule, value, callback) => {
      if (Number(this.dataInfo.user.age)<18) {
        callback(new Error("你还未成年不能注册哦!"));
      } else {
        callback();
      }
    };
  return {
    dataInfo: {
      user:{
        age:''
    	}
    }
    rules:{
      'user.age': [
        { validator: checkAge, trigger: "blur" }
      ],
    }
  }
}

3.验证表单对象中对象的某个属性

//html
<el-form :model="dataInfo" :rules="rules" ref="form"  class="demo-form" >
  //prop必须是数据源里存在的值,触发该prop规则时去判断v-model绑定的值
  <el-form-item label="名称" prop="_age">
    <el-input size="small" v-model="dataInfo.user.age" ></el-input>
	</el-form-item>
</el-form>

//数据
data(){
  var checkAge = (rule, value, callback) => {
      if (Number(this.dataInfo.user.age)<18) {
        callback(new Error("你还未成年不能注册哦!"));
      } else {
        callback();
      }
    };
  return {
    dataInfo: {
      user:{
        age:''
    	}
      _age:''
    }
    rules:{
      _age: [
        { validator: checkAge, trigger: "blur" }
      ],
    }
  }
}

4.验证表单对象中表格里的值(表格整体校验)

//html
<el-form :model="dataInfo" :rules="rules" ref="form"  class="demo-form" >
  //prop必须是数据源里存在的值,触发该prop规则时去判断v-model绑定的值
  <el-form-item label="名称" prop="exprs">
    <el-table :data="dataInfo.exprs" border>
      <el-table-column prop="name" label="识别算法">
        <template slot-scope="{ row }">
          <el-select v-model="row.name">
            <el-option v-for="(item3, index3) in builtInFunction" :label="item3.name" :value="item3.value" :key="index3"></el-option>
          </el-select>
        </template>
    </el-table-column>
	</el-form-item>
</el-form>

//数据
data(){
  return {
    dataInfo: {
      exprs:[{name:''}]
    }
    rules:{
      exprs: [
        { required: true, message: "请输入名称", trigger: "blur" }
      ],
    }
  }
}

5.验证表单对象中表格里的值(表格内字段单独校验)

<template>
  <div class="data-table-edit">
    <el-form ref="form" :model="tableData" :rules="rules" size="small" label-width="100px">
      <div class="sub-head-title">基本信息</div>

      <el-form-item label="表名" prop="name">
        <el-input
          v-model="tableData.name"
          maxlength="20"
          show-word-limit
          placeholder="请填写表名"></el-input>
      </el-form-item>
      <el-form-item label="名称" prop="cnName">
        <el-input v-model="tableData.cnName" placeholder="请填写名称"></el-input>
      </el-form-item>
      <el-form-item label="数据库类型" prop="databaseType">
        <el-select
          v-model="tableData.databaseType"
          placeholder="请选择数据库类型"
          style="width: 100%">
          <el-option label="日志" value="LOG"></el-option> </el-select
      ></el-form-item>
      <el-form-item label="表结构" prop="fields">
        <qz-pro-table
          ref="table"
          border
          :data-source="tableData.fields"
          :pageVisible="false"
          class="space0">
          <qz-table-column prop="name" label="名称" min-width="100" show-overflow-tooltip>
            <template slot-scope="{ row, $index }">
              <el-form-item :prop="'fields.' + $index + '.name'" :rules="rules.name">
                <el-input v-model="row.name" placeholder="名称" size="small"></el-input
              ></el-form-item>
            </template>
          </qz-table-column>
          <qz-table-column prop="cnName" label="列名" min-width="100" show-overflow-tooltip>
            <template slot-scope="{ row, $index }">
              <el-form-item :prop="'fields.' + $index + '.cnName'" :rules="rules.cnName">
                <el-input v-model="row.cnName" placeholder="列名" size="small"></el-input>
              </el-form-item>
            </template>
          </qz-table-column>
          <qz-table-column prop="type" label="字段类型" min-width="120" show-overflow-tooltip>
            <template slot-scope="{ row, $index }">
              <el-form-item :prop="'fields.' + $index + '.type'" :rules="rules.type">
                <el-select v-model="row.type" placeholder="字段类型" size="small">
                  <el-option
                    :label="item.type"
                    :value="item.type"
                    :index="item.type"
                    v-for="item in fieldType[tableData.databaseType]"></el-option>
                </el-select>
              </el-form-item>
            </template>
          </qz-table-column>
        </qz-pro-table>
      </el-form-item>
      <div class="text-right">
        <el-button type="primary" @click="save" size="small" :loading="saveLoading">确定</el-button>
      </div>
    </el-form>
  </div>
</template>

<script>
export default {
  data() {
    const isENValue = (value) => {
      return !new RegExp('^[a-zA-Z_][a-zA-Z0-9_]*$').test(value);
    };
    const validateTableName = (rule, value, callback) => {
      if (value === '') {
        callback(new Error('请输入名称'));
      } else {
        if (isENValue(value)) {
          callback(new Error('此处只支持英文字母'));
        }
        callback();
      }
    };
    const validateFields = (rule, value, callback) => {
      if (!value || value.length === 0) {
        callback(new Error('请填写表结构'));
      } else {
        value?.forEach((item) => {
          if (!item.name || !item.cnName || !item.type) {
            callback(new Error('请填写完整表结构'));
          }
        });
        callback();
      }
    };
    return {
      rules: {
        name: [
          { required: true, message: '请填写名称', trigger: 'blur' },
          { validator: validateTableName, trigger: 'blur' }
        ],
        cnName: [{ required: true, message: '请填写列名', trigger: 'blur' }],
        databaseType: [{ required: true, message: '请选择数据库类型', trigger: 'blur' }],
        type: [{ required: true, message: '请选择字段类型', trigger: 'blur' }],
        fields: [
          { required: true, message: '请填写表结构', trigger: 'blur' },
          { validator: validateFields, trigger: 'blur' }
        ]
      },
      tableData: {
        fields: [
          {
            name: '',
            cnName:'',
            type:null
          }
        ]
      },
      saveLoading: false,
    };
  },
  methods: {
    save() {
      this.$refs['form'].validate((valid) => {
        if (valid) {
          console.log('表单验证通过');
        }
      });
    }
  },
  mounted() {}
};
</script>

<style lang="less" scoped>
.data-table-edit {
  /deep/.qz-pro-table .el-table td:first-of-type {
    padding-left: 0 !important;
  }
  /deep/.qz-pro-table .el-table--border .el-table__cell:first-child .cell {
    padding-left: 5px !important;
  }
  /deep/.el-table .el-table__body-wrapper .cell {
    padding: 0 5px;
  }
  .el-checkbox {
    margin-left: 10px;
  }
  .el-checkbox-group {
    .el-checkbox {
      margin-left: 0px;
      margin-right: 10px;
      /deep/.el-checkbox__label {
        padding-left: 3px;
      }
    }
  }
  .qz-pro-table {
    .el-form-item--small.el-form-item {
      margin-bottom: 0;
    }
  }
}
</style>

6.验证表单对象中循环数组

//html
<el-form :model="fromData" :rules="rules" ref="form"  class="demo-form" >
  <div v-for="(item, index) in fromData.sizeData" :key="index + '_size'" class="clearfix mt24">
    <el-form-item class="fl" label="虚拟SKU" :prop="'sizeData.' + index + '.goods_sn'" :rules="sizeData.goods_sn" required>
      <el-input v-model="item.goods_sn" autocomplete="off" placeholder="请输入SKU" style="width:200px;"></el-input>
    </el-form-item>

    <el-form-item class="fl" label="尺寸规格" :prop="'sizeData.' + index + '.size.type'" :rules="sizeData.size_type" required>
      <el-input v-model="item.size.type" autocomplete="off" placeholder="请选择尺寸值,用英文逗号分隔" style="width:600px;"></el-input>
    </el-form-item>
   </div>

</el-form>

//数据
data(){
  return {
    fromData: {
       sizeData: [
      {
        goods_sn: '',
        size: {
          type: ''
        }
      }
    ],
    }   
    rules:{
      sizeData: {
    goods_sn: [
      { required: true, message: '请输入SKU', trigger: ['change', 'blur'] },
      { validator: validateSku, trigger: ['change', 'blur'] }   // validateSku自定义检验规则,这不用介绍了
    ],
    size_type: [  // 自定义键名
      { required: true, message: '请选择尺寸值,用英文逗号分隔', trigger: ['change', 'blur'] }
    ]
  }
    }
  }
}

//注:这里踩了个坑,就是检验清空输入框会出现代码英文提示,这里最好就是将触发的多个事件名都写上,这样就只会出现我们自定义的提示,trigger: ['change', 'blur']

7. 清空el-input校验提示

this.$refs["form"].clearValidate();
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值