Vue中m:ss时间格式输入正则存在分钟≥6时无法输入后续内容bug求助
问题根因分析
- 你的b变量取值逻辑错误:直接在带冒号的原始输入字符串上执行
replace(/[^0-5]/g, "")后取索引1的字符,当你输入分钟位6之后,输入第二个字符时会触发拼接逻辑,此时原始字符串变为6:,索引1的位置是冒号,会被正则过滤为空,所以b始终是空值,无法拼接出秒的部分,导致输入卡住。 - 整体取值逻辑错位:你没有先统一提取输入中的纯数字序列,而是在带有冒号的原始字符串上按索引取数,冒号的存在会导致数字的实际位置和你预期的索引不一致。
修复方案
你的input组件代码无需修改,仅替换watch中的formatTime监听逻辑即可:
watch: { formatTime (newVal) { // 第一步:提取所有数字,最多保留3位(1位分钟+2位秒) const pureNum = newVal.replace(/[^0-9]/g, '').substr(0, 3) const len = pureNum.length let result = pureNum if (len >= 2) { const minute = pureNum[0] // 秒的十位强制限制为0-5,符合校验规则 const secondTen = Math.min(+pureNum[1], 5) const secondUnit = len >=3 ? pureNum[2] : '' result = `${minute}:${secondTen}${secondUnit}` } // 避免值不变时重复赋值触发死循环 if (result !== newVal) { this.formatTime = result } } }
校验效果说明
- 输入
6→显示6,输入61→自动补冒号显示6:1,输入611→显示6:11,符合分钟位允许0-9的要求 - 输入
161→秒的十位是6会被自动限制为5,最终显示1:51,避免秒数超过59 - 自动过滤所有非数字输入,不需要用户手动输入冒号,输入过程中自动补全格式
内容的提问来源于stack exchange,提问作者Suzy
相关产品推荐
相关产品推荐

