vue3+elementui 数字输入框转千分位展示

一、在main.js中添加自定义指令

  const instance = createApp(App);
  // 金额展示千分位
  instance.directive('thousands', {
    mounted: function (el, binding) {
      // 获取数字输入框
      const numberInput = el.getElementsByTagName('input')[0];
      // 创建一个新的 el-input 元素用来展示格式化后的值
      const textInput = document.createElement('input');
      textInput.type = 'text';
      textInput.autocomplete = 'off';
      textInput.classList.add('el-input__inner');
      // 把创建的元素插入到数字框后
      numberInput.insertAdjacentElement('afterend', textInput);
      // 默认效果
      textInput.style.display = 'block';
      numberInput.style.display = 'none';
      // 文本框聚焦时显示原来数字类型框
      textInput.onfocus = (e) => {
        textInput.style.display = 'none';
        numberInput.style.display = 'block';
        // 等待数字框加载成功时聚焦数字框
        nextTick(() => {
          numberInput.focus();
        });
      };
      // 数字框失焦时显示格式化后的值
      numberInput.onblur = (e) => {
        numberInput.style.display = 'none';
        textInput.style.display = 'block';
      };
    },
    updated: function (el, binding) {
      // debugger
      // 数据改变时格式化赋值到隐藏的文本框
      if (el.tagName.toLocaleUpperCase() !== 'INPUT') {
        const numberInput = el.getElementsByTagName('input')[0];
        const textInput = el.getElementsByTagName('input')[1];
        // 同步禁用状态
        const parentClass = el.classList.value;
        if (parentClass.includes('is-disabled')) {
          textInput.setAttribute('disabled', true);
        } else {
          textInput.removeAttribute('disabled');
        }
        // 千分位格式化
        const valueWithoutComma = numberInput.value.replace(/,/g, ''); // 去除千分号的','
        if (valueWithoutComma) {
          // 转换为浮点数
          const floatValue = parseFloat(valueWithoutComma);
          // 格式化为千分位
          textInput.value = floatValue.toLocaleString('zh', {
            minimumFractionDigits: 2,
            maximumFractionDigits: 2,
          });
        } else {
          textInput.value = '';
        }
      }
    },
  });

二、在具体组件中使用,组件上加上面自定义的指令v-thousands

    <el-input
      v-thousands
      v-model="yourValue"
      type="number"
      clearable
     ></el-input>

三、查看效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值