ElementUI 自定义校验方法不执行 因为没写callback函数

// 校验身份证号
const validateIDCard = (rule, value, callback) => {
  if (value === '') {
    callback(new Error('请输入证件号码!'))
  } else {
   
    if(formData.value.credentialsType == 1){
      if(!isSocialCreditCode(value)){
        callback(new Error('请输入正确的统一社会信用号码!'))
      }
    }
    if(formData.value.credentialsType == 3){
      if (!checkIDCard(value)) {
        callback(new Error('请输入正确的身份证件号码!'))
      }
    }
    return callback();
  }
}
// 验证规则
const CIrules = reactive({
  credentialsNum:[
    { required: true, message: '请输入证件号码', trigger: 'change' },
    { validator: validateIDCard, trigger:'blur'}
  ],
})
 <el-form :model="formData" :rules="CIrules" ref="ruleFormRefCustomer" label-width="120px">
 	<el-col :span="12">
      <el-form-item label="证件号码" prop="credentialsNum">
        <el-input v-model="formData.credentialsNum" clearable placeholder="请输入证件号码"/>
      </el-form-item>
    </el-col>
 </el-form>

还需要注意 prop需要和验证规则CIrules里的字段一致

校验统一社会信用代码是从别人那里搬过来的,页面太多链接🔗就不贴了,但是好用,感谢🙏

/**
 * 校验统一社会信用代码
 * @param val{String}
 * @param checkEnable{Boolean}
 * @returns {Boolean}
 */
 export const isSocialCreditCode = (val, checkEnable = false) => {
	// 前置条件即校验规则的第1至5要求
	const pattern = /^([1-9ANY])([1-9])([0-9]{6})([0-9A-HJ-NP-RT-UW-Y]{10})$/;
	if (!pattern.test(val) || !checkEnable) return pattern.test(val);
	// 定义求模基数31
	const MODE_BASE = 31;
	// 空字符串
	const EMPTY_STR= "";
	// 代码字符数组, 其下标作为代码字符数值
	const CHAR_CODES = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'T', 'U', 'W', 'X', 'Y'];
	// 各位置序号上的加权因子
	const WEIGHT_FACTORS = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
	// 初始化一个与信用代码等长的空的代码字符数值数组
	// 用于和加权因子进行乘积求和运算
	let values = new Array(val.length);
	// 初始化求和值
	let sum = 0;
	// 将信用代码字符串转换为代码字符数值数组
	val.split(EMPTY_STR).forEach((item, index) => values[index] = CHAR_CODES.findIndex(elem => elem === item));
	// 删除最后一位元素(第18位不参与求和计算)
	const endValue = values.pop();
	// 将字符数组数值逐个元素与加权因子乘积求和
  	WEIGHT_FACTORS.forEach((item, index) => sum += item * values[index]);
	// 换算校验代码字符
	// let checkCode = CHAR_CODES[MODE_BASE - sum % MODE_BASE];
	// return val.substring(17, 18) === checkCode;
	// 不换算回字符了,直接用第18位的数值进行比较
	return endValue === (MODE_BASE - sum % MODE_BASE);
}
// 检验身份证号
export function checkIDCard(cardNum) {
  return /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/.test(cardNum)
}

参考我也是看了这篇文章才解决的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值