记一次Uniapp的input输入框type为number时还能输入非数字

起因

问题的出现是uniapp开发微信小程序后,表单填制人数,使用uniapp的input组件,并设置了type为number,然后测试突然提了bug说没有限制,我赶紧打开手机试了一下真机,弹出数字输入框,完全没问题啊;

随后找测试理论,结果她直接打开电脑微信,用电脑打开小程序,并输入了一串神秘代码,我顿时傻眼;

得出结论,只要非手机的环境,没法只弹出数字输入框,所以限制不住,我想的就是输入事件加上正则匹配替换呗;

js 复制代码
   <input
      class="forms-item-input"
      :value="formData.personNum"
      type="number"
      placeholder="请输入人数"
      @input="handlePersonNumInput"
      placeholder-style="color:#999;font-size:24rpx"
    />

   handlePersonNumInput(e) {
      const value = (e.detail.value || "").replace(/\D/g, "");

      this.$set
        ? this.$set(this.formData, "personNum", value)
        : (this.formData.personNum = value);
    }

想必长期混迹uniapp开发的小伙伴已经知道结果了,页面上看没有失效,在input中加上打印,this.formData.personNum打印出来居然是对的,纯数字;

那就是页面没更新呗,随后就开始了不断的尝试

js 复制代码
  handlePersonNumInput(e) {
      const value = (e.detail.value || "").replace(/\D/g, "");
      this.$set
        ? this.$set(this.formData, "personNum", value)
        : (this.formData.personNum = value);
      e.target.value = value
      e.detail.value = value
    }

还是不生效,这种情况就是代码数据更新了,但是视图不更新;

解决方法

各种搜索,各种问AI最后得到了真正的解决方法;

js 复制代码
    handlePersonNumInput(e) {
      const value = (e.detail.value || "").replace(/\D/g, "");

      this.$set
        ? this.$set(this.formData, "personNum", value)
        : (this.formData.personNum = value);
      return value
    }

不知道大家看到差异没有,就是在@input事件中,return出去最后的值,这样input框就会更新为这个值,不得不说真的太坑了

相关推荐
ricardo197314 小时前
浏览器渲染流水线:从 HTML 到屏幕上的像素
前端·面试
武当王丶也14 小时前
React Native App 内更新实践:从版本策略到 APK 下载和安装
android·javascript·react native
明月_清风14 小时前
2026 前端生存指南:8 个正在重塑你职业生涯的技术趋势
前端·ai编程
ZTStory14 小时前
Volta 新一代 node 版本管理工具
前端·javascript·node.js
用户9385156350714 小时前
数组去重,从双重循环到一行 Set,我经历了什么?
javascript·算法
西索ovo14 小时前
揭开神秘面纱!JS 代码执行前竟暗藏玄机
javascript
不易_14 小时前
我的 AI 驱动开发工作流:基于 Cursor 的全流程实战开发方法论
前端·架构
许彰午15 小时前
32 个 Vue 组件的设计取舍
前端·javascript·vue.js
dfdvervdv15 小时前
Vue3 + Element Plus 表单校验踩坑:为什么我写的规则不生效?
前端