文档问题
文档里没有标注@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组件底层对000123
和123
这种前面是任意位0加后面一致数字的情况并不会刷新内部数据,离大谱。
解决方案
// 更新绑定值
setTimeout(() => {
payableAmount.value = value + '_'
setTimeout(() => {
payableAmount.value = value
}, 0)
}, 0)
很抽象的解决方案😀
评论区