记一次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框就会更新为这个值,不得不说真的太坑了

相关推荐
风中的小甜瓜2 小时前
ASP.NET Page 那点事
java·前端·asp.net
木西2 小时前
告别机械重复:使用 Node.js + Playwright 构建 24 小时全自动测试网领水脚本
前端·javascript·node.js
不好听6132 小时前
JavaScript Promise 从入门到精通(一):为什么需要 Promise 以及它是什么
javascript
西柚小萌新2 小时前
【论文写作】--LaTeX详细入门教程2
前端·html
qdkfz2 小时前
JavaScript 如何解析 Outlook .msg 文件 —— @kenjiuno/msgreader
前端·javascript
LuckyDog阿祥2 小时前
卸载Microsoft Edge:EdgeRemover完整操作指南
前端·edge
zhangxingchao2 小时前
AI应用开发九:从 Hermes Agent 学长期记忆
前端·人工智能·后端
xiaofeichaichai2 小时前
Vite原理与Webpack对比
前端·webpack·node.js
_杨瀚博2 小时前
小程序拍证件并局部裁剪
前端