Skip to content

Number Directive

源码
ts

let inputNode: HTMLElement

const float = (arg = 'number', modifiers?: {}, vals?: (number | string)[]) => {
  inputNode.addEventListener(vals?.length ? 'change' : 'input', (e: Event) => {
    const keys = Object.keys(modifiers || {})

    let value =
      (e.target as any).value.replace(
        /[a-z]|[\u4e00-\u9fa5]|[^\x00-\xff]/gi,
        '',
      ) || ''

    // 为空说明只输入了 '/[a-z]|[\u4e00-\u9fa5]|[^\x00-\xff]/ig' 可以匹配的字符
    // 第一位不能为小数点
    if (!value || value === '.') {
      ;(e.target as any).value = ''
      return
    }

    if (vals) {
      for (const i in vals) {
        if (isNaN(Number(vals[i]))) {
          console.error('value 的下标 ', i, '不能转换为数组')
          return
        }
      }
      value = value < vals[0] ? vals[0] : value > vals[1] ? vals[1] : value
    }

    if (arg == 'float') {
      value = String(value)
      // 只能有一位小数点
      // 小数长度 不能 大于 Number(keys[0]
      if (
        value.split('.').length > 2 ||
        value.substr(value.indexOf('.') + 1, value.length).length >
          Number(keys[0] || 2)
      ) {
        // console.log('一位小数点出现2为', value, value.split('.').length);
        ;(e.target as any).value = value.substr(0, value.length - 1)
        return
      }

      value =
        value.indexOf('.') == -1
          ? Number(value).toFixed((keys && Number(keys[0])) || 2)
          : value
    } else {
      value = Number(value)
    }
    ;(e.target as any).value = value
  })
}

app
  .mount('#app')
  .directive('number', (el, binding) => {
    // console.log(binding);

    if (binding.arg && ['number', 'float'].indexOf(binding.arg) === -1) {
      console.error('传递给指令的参数只能为 number,float')
      return
    }

    if (binding.value instanceof Array && binding.value.length !== 2) {
      console.error('传递给指令的 value 值长度不为 2 ')
      console.error('value:', binding.value)
      return
    }
    // 获取input标签元素。el.children[0]兼容el-input
    inputNode = el.tagName === 'INPUT' ? el : el.children[0]

    // value 为一个数组 [min,max]。input的值不能大于max 并且不能小于 min。可以说是input值必须在min和max之间(或者为min和max)
    float(binding.arg, binding.modifiers, binding.value)
  })

注意

固定范围时触发方式为 change,否则为 input

Released under the MIT License.