Vue写一个验证码输入组件

效果

先来看波完成效果图

效果图

需求

输入4位或6位短信验证码,输入完成后收起键盘

实现步骤

第一步

布局排版

"security-code-wrap">"input" class="input-code" @keyup="handleInput($event)" v-model="value"id="code" name="code" type="tel" :maxlength="number"autocorrect="off" autocomplete="off" autocapitalize="off">

  • 使用li元素来模拟输入框的显示,没有别的目的,就只是为了语义化,当然你也可以使用其他任意一个元素来模拟,比如div。
  • 使用label标签的好处在于它可以跟input的click事件关联上,一方面实现了语义化解决方案,另一方面也省去了我们通过js来唤起虚拟键盘。

隐藏输入框

.input-code {position: absolute;left: -9999px;top: -99999px;width: 0;height: 0;opacity: 0;overflow: visible;z-index: -1;
}
  • 将真实的输入框定位到屏幕可视区域以外的地方,虚拟键盘被唤起时,就不会将页面往上顶了。所以你的验证码输入组件一定要放在虚拟键盘遮挡不了的地方。

第二步

处理验证码输入

handleSubmit() {this.$emit('input', this.value)
},
handleInput(e) {this.$refs.input.value = this.valueif (this.value.length >= this.number) {this.hideKeyboard()}this.handleSubmit()
}
  • 输入时,给输入框赋一次值,是为了解决android端上输入框失焦后重新聚焦,输入光标会定在第一位的前面,经过赋值再聚焦,光标的位置就会显示在最后一位后面。

第三步

完成输入后关闭虚拟键盘

hideKeyboard() {// 输入完成隐藏键盘document.activeElement.blur() // ios隐藏键盘this.$refs.input.blur() // android隐藏键盘
}

组件完整代码



组件使用代码

"authCode">

结束语

怎么样,484 so easy

一开始的思路也是4个输入框,监听输入完成跳到下一个输入框,这样的做法也能达到目的,不过需要更多的代码去维护这个规则,不够优雅。

目前的做法已经是我能想到最优的解决方案,如果你有更好的实现思路,还望不吝赐教。


作者:liusong
链接:https://juejin.im/post/5a31ddb251882527541053ee
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部