uni-app 表单input组件type为digit时 输入整数后光标移至最前输入0.失焦小数点丢失
uni-app 表单input组件type为digit时 输入整数后光标移至最前输入0.失焦小数点丢失
测试过的手机:
- iphone 13
- 华为mate60
- H5
操作步骤:
【报Bug】表单input组件type为digit类型时,输入一个整数后,将光标移到最前面输入0.后失焦,小数点会丢失
预期结果:
期望表单输入在中间插入小数点后,失焦后可以得到正确数字的回显
实际结果:
小数点丢失
bug描述:
【报Bug】表单input组件type为digit类型时,输入一个整数后,将光标移到最前面输入0.后失焦,小数点会丢失
附件
信息项 | 值 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Windows |
PC开发环境版本 | windows10 |
手机系统 | 全部 |
页面类型 | vue |
vue版本 | vue3 |
打包方式 | 云端 |
项目创建方式 | CLI |
CLI版本号 | 4.36 |
1 回复
在uni-app中,当表单的<input>
组件的type
属性设置为digit
时,确实会遇到一些特定的行为,比如你提到的输入整数后光标移至最前输入0,并且在输入框失焦(失去焦点)时小数点会丢失。这通常是由于digit
类型的输入框限制只能输入数字(包括整数和小数点后的数字),但输入逻辑上可能有些不一致。
为了解决这个问题,我们可以通过监听输入事件来手动处理输入内容,确保输入符合我们的预期。以下是一个示例代码,展示了如何使用JavaScript和Vue的事件处理机制来管理这种输入:
<template>
<view>
<input
type="text"
v-model="inputValue"
@input="handleInput"
@blur="handleBlur"
placeholder="请输入数字"
/>
</view>
</template>
<script>
export default {
data() {
return {
inputValue: ''
};
},
methods: {
handleInput(event) {
const value = event.target.value;
// 只允许输入数字和一个小数点
const regex = /^(\d*\.)?\d*$/;
if (regex.test(value)) {
// 如果用户输入了小数点但后面没有数字,允许这种情况
if (value.endsWith('.') && !value.match(/\.\d+/)) {
this.inputValue = value;
} else {
// 去除多余的小数点
this.inputValue = value.replace(/\.{2,}/g, '.');
// 确保小数点后最多只有两位数字(可选)
this.inputValue = this.inputValue.replace(/(\.\d{2})\d+/, '$1');
}
} else {
// 如果输入不匹配,恢复到最后一次有效值
this.$nextTick(() => {
const input = this.$el.querySelector('input');
input.value = this.inputValue;
input.setSelectionRange(this.inputValue.length, this.inputValue.length);
});
}
},
handleBlur() {
// 在这里可以进一步处理失焦后的逻辑,比如去除多余的小数点(如果前面没有数字)
if (this.inputValue.startsWith('.')) {
this.inputValue = '0' + this.inputValue;
} else if (this.inputValue.endsWith('.') && !this.inputValue.match(/\.\d+/)) {
this.inputValue = this.inputValue.slice(0, -1);
}
}
}
};
</script>
在这个示例中,我们通过监听@input
事件来实时验证并修正用户输入,确保只接受有效的数字和小数点组合。同时,在@blur
事件中,我们处理了一些边缘情况,比如单独的小数点或小数点后没有数字的情况。这样,即使使用type="digit"
遇到一些问题,也能通过自定义逻辑来避免。