vue3 input 输入框输入值失去焦点后以千分位符显示

日前接到需求需要实现获取焦点数值型输入框以普通字符显示,失去焦点要用千分位符显示。

首先在 main.js 中加入

var desc = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')

Object.getOwnPropertyDescriptor() 静态方法返回一个对象,该对象描述给定对象上特定属性(即直接存在于对象上而不在对象的原型链中的属性)的配置。返回的对象是可变的,但对其进行更改不会影响原始属性的配置。

 Object.defineProperty() 该方法允许查看属性的精确描述。在 JavaScript 中,一个属性由一个字符串值的名称或一个 Symbol 和一个属性描述符组成。关于属性描述符类型及其特性的更多信息可以在 Object.defineProperty() 中找到。

获取所有加入特殊标识的(numInput)的 input 输入框并实时监听值的变化

<el-input size="default" v-model="param.registeredCapital" placeholder="请填写数字,支持小数点后 6 位" v-numInput numInput="true" @input="proxy.numberFilter(9, 6, param, 'registeredCapital')" />
Object.defineProperty(HTMLInputElement.prototype, 'value', {
    ...desc,
    set(v) {
		// let upCls = document.getElementsByClassName('el-upload-list__item-file-name')
		// 判断是否要修改值
		if (this.getAttribute('numInput') === 'true' && v) {
			v = $number.formatCurrencyInput(v)
		}
		desc.set.call(this, v)
    }
})

Object.defineProperty() 静态方法会直接在一个对象上定义一个新属性,或修改其现有属性,并返回此对象。

添加指令,监听失去焦点与获取焦点的事件,修改 numInput 属性触发 Object.defineProperty()

// 自定义指令 数字输入框用千分位符分割
app.directive('numInput', {
	beforeMount(el, binding, vnode) {
		let input = el.children[0].children[0]
		// 获取焦点
		input.addEventListener('focus', function(ev) {
			// 修改是否转换属性为false
			input.setAttribute('numInput', 'false')
			let e = input.value.split(',')
			input.value = e.join('')
		})
		// 失去焦点
		input.addEventListener('blur', function(ev) {
			input.value = $number.formatCurrencyInput(input.value)
			// 修改是否转换属性为true
			input.setAttribute('numInput', 'true')
		})
	}
})

转换千分位符 $number.formatCurrencyInput()

const formatCurrencyInput = (s) => {
	if (s === undefined || s === null || !Number(s) || s === '') {
		return s;
	}
	s = s.toString()
	// n为小数点后保留小数位
	// s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + "";
	let l = s.split(".")[0].split("").reverse()
	let r = s.split(".")[1] || '';
	let t = "";
	for (let i = 0; i < l.length; i++) {
		t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length && l[i + 1] != '-' ? "," : "");
	}
	return t.split("").reverse().join("") + (r ? ("." + r) : '');
	// return Number(s)
};

至此功能完成,传给后端也是数字不带有千分位符,页面失去焦点显示千分位符。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值