Vue2 自定义指令 input 数字格式化

4,115 阅读2分钟

痛点:PC管理后台项目中经常会有input 输入框需要进行格式校验。

例如:

  • 输入正整数 1-100,
  • 输入 整数
  • 输入大于0的数字
  • 输入数字 ....

等各种需求。

这个时候按照正常的写法

  • 对不同业务里面的输入框单个进行格式化。
  • 好的点做法对以上不同情况写几个自定义指令,然后套在input上使用,额额额 让我写这么多指令 好烦啊,

有没有好的方案呢?答案是肯定的,让我们来看下接下来的做法,保证你能收获不少。O(∩_∩)O哈哈~

export default {

  inserted(el, binding, vnode) {

    /**

 * 数字格式化,目前支持 正数 plus, 整数 int, 浮点正数 floatpos, 正常的浮点数,

 * 以上方法都已去掉精度

 * 使用方法如下:

 * v-input-num.plus 正数

 * v-input-num.int 整数

 * v-input-num.floatpos 浮点正数

 * v-input-num 正常的浮点数

 *

 * 特别需要注意的是:

 * 1. 如果vnode.data.model存在,类似于element ui 组件的 el-input,不能直接使用e.target.value 去赋值,要不然表面上是格式化

 * 了数字,但是实际提交的数字还是未格式化的,可以用vnode.data.model.callback(value)去赋值

 * 2. 如果自己写的input,可以直接使用e.target.value 去赋值

 */

    el.addEventListener('change', (e) => {
      const { modifiers } = binding
      const { value } = e.target
      let val = 0 // 默认值为0
      const valIsNaN = isNaN(parseInt(value, 10)) // 如果是NaN, 设置为0
      if (!valIsNaN) {
        // 正数
        if (modifiers.plus) {
          val = Math.abs(parseInt(value, 10))
        } else if (modifiers.int) {
          // 整数
          val = parseInt(value, 10)
        } else if (modifiers.floatpos) {
          // 浮点正数,去精度
          val = Math.abs(parseFloat(value).toFixed(2))
        } else {
          // 数字
          val = parseFloat(parseFloat(value).toFixed(2))
        }
      }

      /**

 * 1. 如果vnode.data.model存在,类似于element ui 组件的 el-input,不能直接使用e.target.value 去赋值,要不然表面上是格式化

 * 了数字,但是实际提交的数字还是未格式化的,可以用vnode.data.model.callback(value)去赋值

 * 2. 如果自己写的input,可以直接使用e.target.value 去赋值

 */

      if (vnode.data.model) vnode.data.model.callback(val)
      else {
        e.target.value = val
      }
    })
  }
}

使用示例如下

// 正数

<el-input v-input-num.plus v-model="scope.row.abc" placeholder=""></el-input>

// 整数

<el-input v-input-num.int v-model="scope.row.abc" placeholder=""></el-input>

// 浮点正数

<el-input v-input-num.floatpos v-model="scope.row.abc" placeholder=""></el-input>

// 正常的浮点数

<el-input v-input-num v-model="scope.row.abc" placeholder=""></el-input>

要是以上不满足条件,都可以在此基础上扩展,不用再去针对单个去判断了,真的好烦。 有错误之处希望大家指出。