溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

vue怎么使用directive限制表單輸入整數(shù)、小數(shù)

發(fā)布時間:2023-04-04 10:29:12 來源:億速云 閱讀:116 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“vue怎么使用directive限制表單輸入整數(shù)、小數(shù)”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強(qiáng),希望這篇“vue怎么使用directive限制表單輸入整數(shù)、小數(shù)”文章能幫助大家解決問題。

限制小數(shù)時可以輸入整數(shù)

1.第一種方法:

const limitPositive = Vue.directive('limitPositive', {
  update(el, {value = 0}, vnode) {  // 當(dāng)被綁定的元素插入到 DOM 中時
    let iscancel = false;
    let num = value
    const inputEvent = e => {
      if (iscancel) {
        return false;
      }
      let res = '/^\\\d*(\\\.?\\\d{0,'+num+'})/g'
      if (num) {
        e.target.value = (e.target.value.match(eval('(' + res + ')'))[0]) || null
      }else {
        e.target.value = (e.target.value.match(/^\d*/g)[0]) || null
      }

      let v = e.target.value;//為綁定的值
      vnode.data.model.callback(v);//改變虛擬節(jié)點上v-model的值
    };
    el.oninput = inputEvent;
    //解決輸入中文的問題
    el.addEventListener("compositionstart", e => {
      iscancel = true;
    });
    el.addEventListener("compositionend", e => {
      iscancel = false;
      inputEvent(e);
    });
  }
})
export { limitPositive }

使用方法

import limitPositive from '@/utils/directives.js'
v-limitPositive="1" //一位小數(shù),數(shù)字可以改變
v-limitPositive 整數(shù)

2.第二種方法:

先建立一個num.js文件

/**
 * 設(shè)置輸入框的值,觸發(fā)input事件,改變v-model綁定的值
 * */
const setVal = (val, el, vNode) => {
  if (vNode.componentInstance) {
    // 如果是自定義組件就觸發(fā)自定義組件的input事件
    vNode.componentInstance.$emit('input', val)
  } else {
    // 如果是原生組件就觸發(fā)原生組件的input事件
    el.value = val
    el.dispatchEvent(new Event('input'))
  }
}

/**
* 參數(shù)檢查
* */
const optionCheck = (binding) => {
  // 范圍值是否為數(shù)值
  if ((binding.value.max && typeof binding.value.max !== 'number') || (binding.value.min && typeof binding.value.min !== 'number')) {
    throw new Error('范圍參數(shù)必須是數(shù)字')
  }
  // 最大最小值存在的時候判斷最大值與最小值是否相等
  if (binding.value.max === binding.value.min && typeof binding.value.max !== 'undefined' && typeof binding.value.min !== 'undefined') {
    throw new Error('最大值和最小值不能相等')
  }
}

/**
* 判斷是否為無效值
* */
const isInvalidVal = (bindValue) => {
  return bindValue === null || isNaN(Number(bindValue)) || bindValue.toString().indexOf('.') === bindValue.length - 1 || bindValue.toString().indexOf('e') !== -1
}

/**
* 處理數(shù)值范圍,如果輸入值超過最大值或最小值,將會被自動設(shè)置為邊界值
* */
const dealRange = (inputValue, binding) => {
  const bindMax = typeof binding.value.max === 'undefined' ? Infinity : binding.value.max
  const bindMin = typeof binding.value.min === 'undefined' ? -Infinity : binding.value.min
  let result = inputValue
  if (inputValue < bindMin) {
    result = bindMin
  }
  if (inputValue > bindMax) {
    result = bindMax
  }
  return result
}

/**
* 阻止輸入
* */
const preventInput = (event) => {
  if (event.preventDefault) {
    event.preventDefault()
  } else {
    event.returnValue = false
  }
}
export default {
  bind(el, binding, vNode) {
    optionCheck(binding)
    // 處理無效值
    const bindValue = vNode.data.model.value
    if (isInvalidVal(bindValue)) {
      setVal(null, el, vNode)
      return
    }

    // 處理數(shù)值范圍
    const inputVal = dealRange(bindValue, binding)
    setVal(inputVal, el, vNode)
  },
  inserted(el, binding, vNode) {
    let content
    // 按鍵按下=>只允許按照一定規(guī)則輸入 數(shù)字/小數(shù)點/減號
    el.addEventListener('keypress', e => {
      const inputKey = String.fromCharCode(typeof e.charCode === 'number' ? e.charCode : e.keyCode)
      const inputReg = /\d|\.|-/
      content = e.target.value
      /**
           * 1.輸入值不是數(shù)字、小數(shù)點、減號
           * 2.輸入框為空或只有減號,不能輸入小數(shù)點
           * 3.重復(fù)輸入小數(shù)點
           * 4.輸入框已有值,不能輸入減號
           * 5.重復(fù)輸入減號
           */
      // todo:已有值的時候,選中輸入框的所有值輸入減號‘-',無法覆蓋輸入
      if (!inputReg.test(inputKey)) {
        preventInput(e)
      } else if (((content === '' || content === '-') && inputKey === '.')) {
        preventInput(e)
      } else if ((content.indexOf('.') !== -1 && inputKey === '.')) {
        preventInput(e)
      } else if ((content !== '' && inputKey === '-')) {
        preventInput(e)
      } else if ((content.indexOf('-') !== -1 && inputKey === '-')) {
        preventInput(e)
      }
    })
    // 按鍵彈起=>并限制最大最小
    el.addEventListener('keyup', e => {
      if (e.keyCode === 8) {
        return
      }
      // 處理無效值
      const bindValue = e.target.value
      if (bindValue === null) {
        setVal(null, el, vNode)
        return
      }

      // 處理數(shù)值范圍
      const inputVal = dealRange(bindValue, binding)
      setVal(inputVal, el, vNode)
    })
    // 失去焦點=>保留指定位小數(shù)
    el.addEventListener('focusout', e => { // 此處會在 el-input 的 @change 后執(zhí)行
      // 處理無效值
      const bindValue = e.target.value
      if (isInvalidVal(bindValue)) {
        setVal(null, el, vNode)
        return
      }

      content = parseFloat(e.target.value)
      const contentStr = String(content)
      if (contentStr.indexOf('.') >= 0 && contentStr.split('.')[1].length > binding.value.precision) {
        let arg_precision = 0// 默認(rèn)保留至整數(shù)
        if (binding.value.precision) {
          arg_precision = parseFloat(binding.value.precision)
        }
        content = content.toFixed(arg_precision)
      }
      setVal(content, el, vNode)
    })
  }
}

在index.js文件引入

import onlyNumber from './num'
const install = Vue => {
  Vue.directive('onlyNumber', onlyNumber)
}
/*
  Vue.use( plugin )
  安裝 Vue.js 插件。如果插件是一個對象,必須提供 install 方法。
  如果插件是一個函數(shù),它會被作為 install 方法。install 方法調(diào)用時,會將 Vue 作為參數(shù)傳入。
  該方法需要在調(diào)用 new Vue() 之前被調(diào)用。
  當(dāng) install 方法被同一個插件多次調(diào)用,插件將只會被安裝一次。
*/

if (window.Vue) {
  window['onlyNumber'] = onlyNumber
  Vue.use(install); // eslint-disable-line
}

onlyNumber.install = install
export default onlyNumber

// 使用  例子:v-only-number="{max:100,min:0,precision:2}"

使用例子:
// 在main.js全局注入
import onlyNumber from &lsquo;@/directive/num&rsquo;
Vue.use(onlyNumber)

v-only-number=“{max:100,min:0,precision:2}”
max:最大值
min:最小值
precision:保留小數(shù)

<el-input v-model="value" v-only-number="{max:1000,min:0}" placeholder="請輸入"/>

關(guān)于“vue怎么使用directive限制表單輸入整數(shù)、小數(shù)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI