vue2表单自定义校验规则判断输入值是否为大于零的数字

应用场景

        我自己是用于表单验证,验证用户输入的办公面积是否合法。所以我对于输入数据的要求就是:数字、大于零。

思路历程

        因为element-ui没有现成的验证规则可用,所以我准备自己定义一个验证规则函数。然后对输入的值用typeof来判断,结果发现无论输入什么,全为string!!究其原因,是因为vue中表单中读入的值默认为string(不管你输入的是不是number,全部转化为string)。

 //自定义验证函数
const ValidFirmArea = (rule, value, callback) => {
      console.log(typeof value);//string
    
    };




rules:{
     firmArea: [//办公面积
          {
            validator: ValidFirmArea,
            trigger: "blur",
          },
}

        好吧,既然是这样的,我就把传过来的值转化为Number

 //自定义验证函数
const ValidFirmArea = (rule, value, callback) => {
      value=Number(value)//如果value是数字类型的字符(例如:'12'),那么转化过后是number,如果是非数字为NaN    
      console.log(typeof value);
    };

看似仿佛解决了问题,可以区分number和非number,但是 !!让我们看看下面的例子

console.log(typeof 12)//number

console.log(typeof NaN)//number

NaN用typeof检测出来也是number,那就区分不出了

好的我又采用isNaN来区分NaN和number

根据上图来看,他是可以区分的,所以问题解决!

完整代码
  <!--          办公面积(单位:平方米)-->
            <el-descriptions-item span="2">
              <template slot="label">
                <div class="text-center">办公面积</div>
              </template>
              <el-form-item prop="firmArea">
                <el-input
                  style="width: 20%"
                  v-model="basicInfo.firmArea"
                ></el-input
                >平方米
              </el-form-item>
            </el-descriptions-item>



data() {
    const ValidFirmArea = (rule, value, callback) => {
      // console.log(typeof value);
      if (value == 0) {
        callback(new Error("办公面积不能为空或0"));
      } else if (value < 0) {
        callback(new Error("输入不能为负数"));
      } else {
        value = Number(value);
        if (isNaN(value)) {
          callback(new Error("输入必须为纯数字"));
        }
        callback();
      }
    };
    return {
            rules:{
                 firmArea: [
                 {
                    validator: ValidFirmArea,
                    trigger: "blur",
                  },
                ],
            }
    
    }
  • 29
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中,单自定义校验不能出现中文字符,原因是因为Vue使用的是JavaScript语言,而JavaScript默认使用的是Unicode字符集。Unicode字符集包含了全世界几乎所有的字符,包括中文字符。但是,JavaScript的正则达式在处理Unicode字符时,可能会出现一些问题。 为了解决这个问题,我们可以使用Unicode转义序列来示中文字符。Unicode转义序列的格式为"\uXXXX",其中XXXX是一个四位的十六进制数,代一个Unicode字符。 举个例子,假设我们要自定义校验一个单中的输入不能包含中文字符,我们可以使用正则达式进行校验。正则达式可以使用Unicode转义序列来排除中文字符。 下面是一个简单的示例代码: ```javascript Vue.directive('no-chinese', { update: function (el, binding, vnode) { const value = vnode.data.model.value; const pattern = /[^\u4e00-\u9fa5]/g; // 使用Unicode转义序列排除中文字符 const isValid = pattern.test(value); if (!isValid) { // 如果输入中包含中文字符,则给输入框添加class来指示错误 el.classList.add('has-error'); } else { // 如果输入中不包含中文字符,则移除错误class el.classList.remove('has-error'); } } }); ``` 在上面的代码中,我们定义了一个名为"no-chinese"的自定义指令,通过`update`钩子函数来处理输入校验。我们使用了`/[^\u4e00-\u9fa5]/g`正则达式来排除中文字符。 当输入中包含中文字符时,我们通过给输入框添加class "has-error"来指示错误。当输入中不包含中文字符时,我们移除错误class。 当然,这只是一个简单的示例,请根据实际需求进行适当的修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值