侧边栏壁纸
博主头像
Brooks' Forest 博主等级

空山闻悲雁,净水映幽兰。 扑蝶乡童子,未觉秋叶残。

  • 累计撰写 35 篇文章
  • 累计创建 17 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

uni-easyinput组件input事件在微信小程序端问题

Ivy Forest
2025-04-11 / 0 评论 / 0 点赞 / 16 阅读 / 0 字 / 正在检测是否收录...

文档问题

文档里没有标注@input事件是有回调的,且回调值与uniapp的原生组件input不一样

uni-easyinput的@input事件返参直接就是数据值发生变化后的值,也就是当内容从ab变为abc时,直接返回abc

input组件则依照文档,返回格式为{ detail:{ value: 'abc' }}

监听问题

如果你用了uni-easyinput的@input,且不用上面事件的回调返参而想着在input回调里取v-model绑定的值那就完蛋了,它会延迟。比如内容从ab变为abc时,在input回调里打印绑定变量为ab

绑定值纠正问题

如果想在回调里对数据进行维护并重新赋值,则会出现奇奇怪怪的问题。

比如我使用了如下的结构

<uni-easyinput
	v-model="payableAmount"
	type="digit"
	placeholder="请输入支付金额"
	:clearable="false"
	:inputBorder="false"
	@input="payableAmountInput"
>
	<template #right>
		<view class="pr-2"></view>
	</template>
</uni-easyinput>

const payableAmountInput = (e: any) => {
	let value = String(e)
	if (!value) return

	// 1. 只允许数字和小数点,并过滤非法字符
	value = value.replace(/[^\d.]/g, '')

	// 2. 处理多个小数点:只保留第一个,删除后续的小数点
	const firstDotIndex = value.indexOf('.')
	if (firstDotIndex !== -1) {
		value =
			value.substring(0, firstDotIndex + 1) +
			value.substring(firstDotIndex + 1).replace(/\./g, '')
	}

	// 3. 分离整数部分和小数部分
	let [integerPart, decimalPart = ''] = value.split('.')

	// 4. 处理整数部分的前导零(修复版)
	if (integerPart === '0') {
		// 如果本身就是 "0",不做处理(避免 "0" 被替换成空)
	} else {
		// 否则去掉所有前导零,如果结果为空则补 "0"
		integerPart = integerPart.replace(/^0+/, '') || '0'
	}

	// 5. 处理小数部分:限制最多两位
	if (decimalPart.length > 2) {
		decimalPart = decimalPart.substring(0, 2)
	}

	// 6. 重新组合结果
	value = firstDotIndex !== -1 ? `${integerPart}.${decimalPart}` : integerPart

	// 更新绑定值
	setTimeout(() => {
		payableAmount.value = value + '_'
		setTimeout(() => {
			payableAmount.value = value
		}, 0)
	}, 0)
}

你会发现它实现了绝大部分的维护需求,却唯独无法处理000012323123,经查代码无问题,在143行输出已然是12323123,却就是更新绑定值无用

经一个小时测试,确定无误。

总结一下,就是uni-easyinput组件底层对000123123这种前面是任意位0加后面一致数字的情况并不会刷新内部数据,离大谱。

解决方案

	// 更新绑定值
	setTimeout(() => {
		payableAmount.value = value + '_'
		setTimeout(() => {
			payableAmount.value = value
		}, 0)
	}, 0)

很抽象的解决方案😀

0

评论区