【directives】自定義指令之input數(shù)值

需求

由于input輸入框的number類(lèi)型不調(diào)好用,故通過(guò)自定義指令給element el-input組件設(shè)置輸入限制

功能

1.可設(shè)置允許輸入的最大最小值
2.可設(shè)置精度
3.限制非數(shù)值輸入

輸入限制

1.小數(shù)點(diǎn)"."不允許出現(xiàn)在第一位,且只允許輸入一次
2.負(fù)號(hào)"-"僅可以出現(xiàn)在第一位,且配置最小值允許出現(xiàn)負(fù)值時(shí)可用
3.限制輸入法的輸入事件

未實(shí)現(xiàn)功能TODO/(ㄒoㄒ)/~~

精度攔截目前在輸入時(shí)未做攔截
原因:在輸入框輸入達(dá)到精度限制時(shí),此時(shí)按ctrl+a想要執(zhí)行覆蓋選中重新輸入操作時(shí),輸入事件會(huì)判斷達(dá)到輸入精度做大值,無(wú)法執(zhí)行上述操作
替換方案:在輸入框失去焦點(diǎn)時(shí)做精度格式化

有解決方案的小伙伴歡迎解答 ??T_T

demo如下??

提供三個(gè)參數(shù)
{min: -100, max: 100, precision: 2},
1.min最小值:默認(rèn)-100
2.max最小值:默認(rèn)100
3.precision精度(保留小位數(shù)):默認(rèn)2

'懶人'提醒

可根據(jù)需求修改默認(rèn)值,或設(shè)置為null不做限制
只需將demo中對(duì)應(yīng)的監(jiān)聽(tīng)事件里 聲明的 _min 和 _max 和 _precision 改為想要的默認(rèn)值即可

//keypress下
let _precision = 2;
let _max = 100;
let _min = -100;
//keyup下
let _precision = 2;
let _max = 100;
let _min = -100;
//focusout
let _precision = 2;
<template>
  <div class="hello">
    <el-input
      type="text"
      v-model="test"
      v-only-number="{ min: -100, max: 100, precision: 2 }"
    ></el-input>
</template>
<script>
export default {
  name: "HelloWorld",
  directives: {
    onlyNumber: {
      // 只調(diào)用一次,第一次綁到元素時(shí)調(diào)用。在這里可以進(jìn)行一次性的初始化設(shè)置。
      bind: function (el, vDir) {
        let dom = el.tagName == "INPUT" ? el : el.querySelector("input");
        dom.placeholder = "請(qǐng)輸入數(shù)值" + JSON.stringify(vDir.value);
      },
      // 當(dāng)被綁定的元素插入到 DOM 中時(shí)
      inserted: function (el, vDir) {
        let dom = el.tagName == "INPUT" ? el : el.querySelector("input");
        //記錄當(dāng)前值
        let content = dom.value;
        //插槽參數(shù)
        let config = vDir.value;

        /**
         * @function 輸入有效值監(jiān)聽(tīng)事件
         * @description 只允許輸入 數(shù)字/小數(shù)點(diǎn)/負(fù)號(hào)
         */
        el.addEventListener("keypress", (e) => {
          //阻止輸入
          function preventInput() {
            if (e.preventDefault) {
              e.preventDefault();
            } else {
              e.returnValue = false;
            }
          }
          let re = /\d|\.|-/; //只允許輸入 數(shù)字/小數(shù)點(diǎn)/負(fù)號(hào)
          let key = e.key; //輸入值
          content = e.target.value; //輸入值生效前的值
          //配置
          let _precision = 2;
          let _max = 100;
          let _min = -100;
          if (config) {
            _precision = parseInt(config.precision);
            _max = parseFloat(config.max);
            _min = parseFloat(config.min);
          }
          if (!re.test(key)) {
            preventInput();
          } else if ((content.indexOf(".") > 0 || !content) && key == ".") {
            // .不允許出現(xiàn)在第一位,且只允許輸入一次

            preventInput();
          } else if ((_min >= 0 || content) && key == "-") {
            // "-"號(hào)僅可以出現(xiàn)在第一位,且配置最小值允許出現(xiàn)負(fù)值

            preventInput();
          } else if (
            // 精度攔截
            content.split("").reverse().join("").indexOf(".") == _precision
          ) {
            // preventInput();
          }
        });
        el.addEventListener("keyup", (e) => {
          let value = e.target.value; //輸入值生效后的值
          //輸入非數(shù)值,keypress已過(guò)濾,此處過(guò)濾輸入法輸入中文情況
          if (isNaN(value) && value !== "-") {
            e.target.value = content;
            return false;
          }

          content = value;
          //精度
          let _precision = 2;
          let _max = 100;
          let _min = -100;
          if (config) {
            _precision = parseInt(config.precision);
            _max = parseFloat(config.max);
            _min = parseFloat(config.min);
          }

          if (value > _max) {
            e.target.value = _max;
            content = _max;
          }
          if (value < _min) {
            e.target.value = _min;
            content = _min;
          }
        });
        el.addEventListener("focusout", (e) => {
          let value = e.target.value;
          //精度
          let _precision = 2;
          if (config) {
            _precision = parseInt(config.precision);
          }
          e.target.value =
            value != "" ? parseFloat(value).toFixed(_precision) : "";

          dom.dispatchEvent(new Event("input"));
        });
      },
    },
  },
  data() {
    return {
      test: "",
    };
  },
  
  watch:{
    test(){
      console.log('watch test',this.test)
    }
  }
};

</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容