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

本文介绍了如何在Vue.js应用中创建一个名为thousands的自定义指令,用于金额的千分位格式化,并在`el-input`组件中使用该指令实现动态格式化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、在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>

三、查看效果

### 创建 Vue 自定义指令实现输入框千分位格式化 在 Vue 中创建自定义指令来实现在 `el-input` 组件中的千分位格式化功能,可以按照如下方式操作: #### 定义自定义指令逻辑 通过 Vue 的 `directive` 方法注册一个新的全局指令 `v-thousand-separator`。该指令会在绑定到元素上时自动处理用户的输入并将其换为带有千分位分隔符的字符串。 ```javascript // 注册全局自定义指令 thousandSeparator Vue.directive(&#39;thousand-separator&#39;, { bind(el, binding) { const toFixedValue = binding.value.toFixed || 0; function formatToThousand(value) { if (value === &#39;&#39;) return &#39;&#39;; let num = parseFloat(value.replace(/,/g, &#39;&#39;)); if (!isNaN(num)) { return num.toLocaleString(undefined, { minimumFractionDigits: toFixedValue }); } return value; } el.addEventListener(&#39;input&#39;, () => { setTimeout(() => { el.value = formatToThousand(el.value); }, 0); }); // 初始化显示已有的数值 if (el.value !== &#39;&#39;) { el.value = formatToThousand(el.value); } }, }); ``` 此代码片段实现了当用户输入数据后立即应用千分位格式化的功能[^1]。 #### 使用自定义指令于模板中 接下来,在 HTML 或者单文件组件(SFC)内的 `<template>` 部分使用这个新创建好的指令: ```html <el-input v-model="form.Plan_Settlement_Amount" class="input" v-thousand-separator="{toFixed:2}" /> ``` 这里设置了 `v-thousand-separator` 指令,并传递了一个对象参数 `{toFixed:2}` 来指定保留两位小数。 为了确保输入的数据能够被正确解析成数字而不是字符串形式保存下来,还需要调整 VModel 所关联的数据属性 `Plan_Settlement_Amount` 的 setter 和 getter 函数,以便去除所有的逗号再进行赋值操作。 ```javascript data() { return { form: { get Plan_Settlement_Amount() { return this._planSettlementAmount ? Number(this._planSettlementAmount).toLocaleString() : &#39;&#39;; }, set Plan_Settlement_Amount(newValue) { this._planSettlementAmount = newValue.replace(/[^\d.-]/g, &#39;&#39;); }, _planSettlementAmount: &#39;&#39; } }; } ``` 这段 JavaScript 代码展示了如何利用计算属性的方式管理表单项的状态变化,从而保证每次更新视图层的同时也能同步修改实际存储的数据[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值