ElementUI表单校验rules封装

工具文件: validator.js

//校验规则列表(可扩展)
const rules = {
  URL(url) {
    const regex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?"\\+&%$#=~_-]+))*$/
    return valid(url, regex, "URL格式不正确")
  },

  LowerCase(str) {
    const regex = /^[a-z]+$/
    return valid(str, regex, "只能输入小写字母")
  },

  UpperCase(str) {
    const regex = /^[A-Z]+$/
    return valid(str, regex, "只能输入大写字母")
  },

  Alphabets(str) {
    const regex = /^[A-Za-z]+$/
    return valid(str, regex, "只能输入字母")
  },

  Email(email) {
    const regex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
    return valid(email, regex, "邮箱地址格式不正确")
  },

  Mobile(mobile) {
    const regex = /^1\d{10}$/
    return valid(mobile, regex, "手机号格式不正确")
  },

  Phone(phone) {
    const regex = /^(0\d{2,3})?-?\d{7,8}$/
    return valid(phone, regex, "电话号码格式不正确")
  },

  Postcode(postcode) {
    const regex = /^[0-9][0-9]{5}$/
    return valid(postcode, regex, "邮编格式不正确")
  },

  Number(num) {
    const regex = /^\d+$/
    return valid(num, regex, "只能输入纯数字")
  },

  Fax(fax) {
    const regex = /^(\d{3,4}-)?\d{7,8}$/
    return valid(fax, regex, "传真格式不正确")
  },

  Int(num) {
    const regex = /^((0)|([1-9]\d*))$/
    return valid(num, regex, "只能输入非负整数")
  },

  IntPlus(num){
    const regex = /^[1-9]\d*$/
    return valid(num, regex, "只能输入正整数")
  },

  Float1(num){
    const regex = /^-?\d+(\.\d)?$/
    return valid(num, regex, "只能输入数字,最多一位小数")
  },

  Float2(num){
    const regex = /^-?\d+(\.\d{1,2})?$/
    return valid(num, regex, "只能输入数字,最多两位小数")
  },

  Float3(num){
    const regex = /^-?\d+(\.\d{1,3})?$/
    return valid(num, regex, "只能输入数字,最多三位小数")
  },
  
  FloatPlus3(num){
    const regex = /^\d+(\.\d{1,3})?$/
    return valid(num, regex, "只能输入数字,最多三位小数")
  },

  Encode(code){
    const regex = /^(_|-|[a-zA-Z0-9])+$/
    return valid(code, regex, "编码只能使用字母、数字、下划线、中划线")
  },

  Encode2(code){
    const regex = /^[a-zA-Z0-9]+$/
    return valid(code, regex, "编码只能使用字母、数字")
  },

  Encode3(code){
    const regex = /^(_|[a-zA-Z0-9])+$/
    return valid(code, regex, "编码只能使用字母、数字、下划线")
  },

  IdCard(code){
    const regex = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
    return valid(code, regex, "请输入正确的身份证号码")
  },
  
  USCC(code){
    const regex = /^[0-9A-Z]{18}/
    return valid(code, regex, "请输入正确的社会信用号")
  },
  
  CarNum(code){
    const regex = /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/i
    return valid(code, regex, "请输入正确的车牌号")
  },
  
  CNandEN(code){
    const regex = /^[a-zA-Z\u4e00-\u9fa5]+$/
    return valid(code, regex, "只能使用中文、英文")
  },
  
  MobileOrPhone(val){
  	const result = /^1\d{10}$/.test(val) || /^(0\d{2,3})?-?\d{7,8}$/.test(val)
  	return valid(result, null, "手机或电话号格式不正确")
  }
}

//val:String 要校验的值
//regex:RegExp 校验正则,不是正则时val作为result的值
//msg:String 校验不通过的错误信息
function valid(val, regex, msg){
  return {result: regex instanceof RegExp? regex.test(val) : !!val, errMsg: msg}
}

//required:Boolean 是否必填项,选填,默认"true"
//type:String/Function 校验类型,选填,
//     String时必须是上面rules中存在的函数名,
//     Function时只接收一个参数(输入值),返回格式: {result:Boolean, errMsg:String}
//trigger:String 触发动作,选填,默认"blur"
//nullMsg:String 未输入的提示语,选填,required=true时有效
export function vxRule(required=true, type, trigger="blur", nullMsg="该字段为必填项"){
  const rule = { required: !!required, trigger}

  let check = null
  if(typeof type === "function"){
    check = type
  }else{
    check = type ? rules[type+""] : null
  }

  if(check){//存在规则时添加规则
    rule.validator = (r, v, c) => {
      const {result, errMsg} = check(v)
      if(required){
        //必填项: null,undefined,"","  " 都算无输入内容
        return (v==null || (v+"").trim()==="") ? c(new Error(nullMsg)) : result ? c() : c(new Error(errMsg))
      }
      //选填项: null,undefined,"" 都算无输入内容,"  "会被校验
      return (v==null || (v+"")==="" || result) ? c() : c(new Error(errMsg))
    }
  }else{
    rule.message = nullMsg
  }

  return [rule]
}

使用validator.js

//example:
import { vxRule } from "./validator"
export default {
  data(){
    return {
      rules: { //rules绑定到el-form的rules属性
        //必填,blur触发,为空时使用默认提示语
        aaa: vxRule(),
        //必填,blur触发,为空时使用自定义提示语
        bbb: vxRule(true, null, "blur", "请输入bbb"),
        //必填,change触发,为空时使用自定义提示语
        ccc: vxRule(true, null, "change", "请选择ccc"),
        //必填,blur触发,使用rules中的校验规则,为空时使用默认提示语
        ddd: vxRule(true, "URL"),
        //必填,blur触发,使用rules中的校验规则,为空时使用自定义提示语
        eee: vxRule(true, "Number", "blur", "请输入eee"),
        
        //选填时候,第4个参数是多余的,因为用不到
        //选填,blur触发,使用rules中的校验规则
        fff: vxRule(false, "Float3"),
        //选填,blur触发,使用自定义校验规则
        ggg: vxRule(false, val=>{
          return {result: /^[a-z]+$/.test(val), errMsg: "只能输入小写字母"}
        })
      }
    }
  }
}
  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
要将 ElementUI表单封装成组件,可以按照以下步骤进行: 1. 创建一个 Vue 组件文件,命名为 form.vue。 2. 在组件中引入 ElementUI表单组件和相关组件库,例如 Input、Select、Radio 等。 3. 在组件中定义表单的数据模型和校验规则。 4. 使用 ElementUI表单组件和相关组件库,将表单的各个字段进行渲染,并绑定数据模型和校验规则。 5. 在组件中定义提交表单的方法,并将表单数据作为参数传递给父组件或调用后端接口进行处理。 6. 在父组件中引入 form.vue 组件,并通过 props 向组件传递数据和校验规则。 7. 在父组件中监听子组件的 submit 事件,调用子组件的提交表单方法。 示例代码: form.vue 组件: <template> <div> <el-form :model="form" :rules="rules" ref="form"> <el-form-item label="姓名" prop="name"> <el-input v-model="form.name"></el-input> </el-form-item> <el-form-item label="性别" prop="gender"> <el-radio-group v-model="form.gender"> <el-radio label="male">男</el-radio> <el-radio label="female">女</el-radio> </el-radio-group> </el-form-item> <el-form-item label="年龄" prop="age"> <el-input v-model.number="form.age"></el-input> </el-form-item> <el-form-item label="爱好" prop="hobby"> <el-select v-model="form.hobby" multiple> <el-option label="篮球" value="basketball"></el-option> <el-option label="足球" value="football"></el-option> <el-option label="游泳" value="swimming"></el-option> </el-select> </el-form-item> </el-form> <el-button type="primary" @click="submitForm">提交</el-button> </div> </template> <script> export default { data() { return { form: { name: '', gender: '', age: '', hobby: [] }, rules: { name: [ { required: true, message: '请输入姓名', trigger: 'blur' } ], gender: [ { required: true, message: '请选择性别', trigger: 'change' } ], age: [ { required: true, message: '请输入年龄', trigger: 'blur' }, { type: 'number', message: '年龄必须为数字值', trigger: 'blur' } ], hobby: [ { required: true, message: '请选择爱好', trigger: 'change' } ] } } }, methods: { submitForm() { this.$refs.form.validate(valid => { if (valid) { this.$emit('submit', this.form); } }); } } } </script> 父组件: <template> <div> <form :model="form" :rules="rules" @submit="handleSubmit"> <form-item label="姓名" prop="name"> <input v-model="form.name"/> </form-item> <form-item label="性别" prop="gender"> <radio-group v-model="form.gender"> <radio label="male">男</radio> <radio label="female">女</radio> </radio-group> </form-item> <form-item label="年龄" prop="age"> <input v-model.number="form.age"/> </form-item> <form-item label="爱好" prop="hobby"> <select v-model="form.hobby" multiple> <option label="篮球" value="basketball"></option> <option label="足球" value="football"></option> <option label="游泳" value="swimming"></option> </select> </form-item> </form> </div> </template> <script> import Form from './form.vue'; export default { components: { Form }, data() { return { form: {}, rules: {} } }, methods: { handleSubmit(data) { // 处理表单数据 } } } </script>
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值