自定义指令一【输入金额格式化、输入验证、提交验证】

Vue.js输入验证与格式化
本文介绍如何使用Vue.js自定义指令实现输入金额的实时格式化及输入验证功能,包括金额格式化、输入验证及提交验证的实现细节。

1【输入金额格式化】

// 输入金额格式化
Vue.directive('rmb', {
  // 当被绑定的元素插入到 DOM 中时……
  inserted: function (dm, binding, vNode) {
    let el = dm.children[0];


    el.addEventListener('keyup', function (event) {
      let s = el.value.replace(/,/g,"");
      let n = 3;
      if(!s){
        dm.children[0].value = 0
      }else{
        n = n > 0 && n <= 20 ? n : 2;
        s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) 

+ "";
        var l = s.split(".")[0].split("").reverse(), r = s.split

(".")[1];
        var t = "";
        for (var i = 0; i < l.length; i++) {
          t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? "," 

: "");
        }
        dm.children[0].value = t.split("").reverse().join("");
      }



      // if(!value) {
      //   dm.children[0].value ="0.00"
      // }
      // let intPart = Number(value).toFixed(0); //获取整数部分
      // let intPartFormat = intPart.toString().replace(/(\d)(?=(?:

\d{3})+$)/g, '$1,'); //将整数部分逢三一断
      //
      // let floatPart = ".00"; //预定义小数部分
      // let value2Array = value.split(".");
      //
      // //=2表示数据有小数位
      // if(value2Array.length == 2) {
      //   floatPart = value2Array[1].toString(); //拿到小数部分
      //
      //   if(floatPart.length == 1) { //补0,实际上用不着
      //     dm.children[0].value =  intPartFormat + "." + floatPart 

+ '0';
      //   } else {
      //     dm.children[0].value = intPartFormat + "." + floatPart;
      //   }
      //
      // } else {
      //   dm.children[0].value =  intPartFormat + floatPart;
      // }
    })



  }
});

2【输入验证】

//main.js
import Vue from 'vue'
const IP_REGEX = /[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/im;
const regEn =/[·!#¥(——):;“”‘、,|《。》?、【】[\]]/im;
// 输入验证
Vue.directive('checkParam', {
  // 当被绑定的元素插入到 DOM 中时……
  inserted: function (dm, binding, vNode) {
    let el = dm.children[0]
    el.addEventListener('keyup', function (event) {

      // 首先去除已有样式
      dm.className = dm.className.replace('input-error', '').trim();
      console.log(event.keyCode);
      // 判断正则
      let regex = binding.value.regex;
      if (regex === 'IpRegex') {
        console.log(IP_REGEX.test(el.value))
        if (IP_REGEX.test(el.value) || regEn.test(el.value)) {
          dm.className += ' input-error'
          console.log(dm.className)
        }
      }
      else if (!regex.test(el.value)) {
        console.log(regex.test(el.value))
        dm.className += ' input-error'
      }
      if (!event.keyCode) { // 加上这个判断就是在提交时,才会校验
        // 判断是否是否必填
        let isRequired = binding.value.required;
        if (isRequired) {
          if (!el.value || el.value === '') {
            dm.className += ' input-error'
          }
        }

        // 判断正则
        let regex = binding.value.regex;
        if (regex === 'IpRegex') {
          console.log(IP_REGEX.test(el.value));
          if (IP_REGEX.test(el.value) || regEn.test(el.value)) {
            dm.className += ' input-error'
          }
        }
        else if (!regex.test(el.value)) {
          dm.className += ' input-error'
        }
      }

      let isRequired = binding.value.required;
      if (isRequired) {
        if (!el.value || el.value === '') {
          dm.className += ' input-error'
        }
      }


    })
  }
});
//test.vue
<el-input v-model="name"  v-checkParam="{required:true,value:'营销任务名称'}" 

3【提交验证】


// 提交验证 main.js
Vue.directive('checkSubmit', {
  // 当被绑定的元素插入到 DOM 中时……
  inserted: function (el, binding, vNode) {
    el.addEventListener('click', function (event) {
      let elements = document.getElementsByClassName('v-check');
      var evObj = document.createEvent('Event');
      console.log(Event)
      evObj.initEvent('keyup', true, true);
      for (let element of elements) {
        element.children[0].dispatchEvent(evObj)
      }
      let errorInputs = document.getElementsByClassName('input-error');
      if(errorInputs.length === 0){
        vNode.context.submit();
      }
    })
  }
});
//test.vue
<button class="btn repeat"  v-checkSubmit>添加机构任务明细</button>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值