使用<input>标签实现六个格子验证码输入框
前言
现在的需求是要实现一个六个格子验证码输入框,本来是想直接在网上找现成的轮子的,但是找了一圈没发现可以让我满意的,那就试着自己摸索了。
效果图
功能需求
只支持纯数字输入,我们知道如果
input
设置type
为number
时,其实是可以输入自然常数e
这个英文字母的,而且对于处理这种纯数字输入,如果处理不当,在中文模式下打出拼音,这时,切换中英文经常出现输入了英文字母的现象。在前一个输入框输入完成,光标自动移动至下一个输入框。
按下
BackSpace
键,清空当前输入框内容,光标自动移动至上一个输入框。没有输入完整,会在下方出现“请输入验证码”提示。
实现过程
一开始是打算使用element-ui
组件库里的el-input
组件来实现的,但是因为样式的原因,就作罢了,还有就是想着只用一个input
能不能来实现这个功能,但是研究了一番,还是没能成功,最后就是现在这个,使用了六个input
来实现,样式方面问题不大,就不多说明了,主要是功能层面,验证码输入,那一定就是只能是数字了,那么首要解决的当然就是限制输入,只能允许用户输入数字,如下代码所示:
当用户输入的是非数字时,默认会替换成空字符串,也就达到了限制输入,只能输入纯数字的目的。
接着,我们来看一下第二点的需求,要实现这个功能,就需要知道什么时候让当前输入框失去焦点,并且同时让下一个输入框获取焦点,让一个输入框获取焦点,其实可以使用vue.js
里的ref
属性来实现,代码如下所示:
但是现在是使用v-for
来遍历生成六个input
的,如果要设置ref
属性,那怎么区分这六个input
,代码如下所示:
直接是通过index
来设置,实现六个input
不同的ref
命名的,然后就是在v-for
中使用ref
会遇到的问题了,在vue.js
官网中,我们可以看到,有这样一句话:
也就是说,在v-for
中,你如果是这样使用ref
的话是无效的,并不能正确的获取到对应的第一个input
的属性,代码如下所示:
所以,你需要修改为这种方式来使用,代码如下所示:
至此,第二点需求,就好解决了,代码如下所示:
以此类推,第三点需求,也跟着解决了,代码如下所示:
至于第四点需求,其实只要通过判断输入值的长度来判断即可,那就是如果输入了,但是没有完整输入六位验证码,那么就提示用户,代码如下所示:
写在最后
其实,说到底这个功能很一般,感觉根本没什么难度,之所以选择很认真的去记述这样的一个过程,主要还是知道苍蝇虽小,五脏俱全,小的事情能够做好,那么大的事情才能有底气去完成。而且,很多事情,都是有规律的,往往可以举一反三,再说了,想要能够在某个方面有所建树,不是一蹴而就的,往往都是经过长年累月的努力,一点点打磨和沉淀的,所以,我现在能做的,只是尽自己所能,可以把一个东西讲清楚,把整个逻辑理清,这就算是很不错的收获了。
完整代码
示例代码:https://github.com/BRAVE2HEART/infoq-vue-example
版权声明: 本文为 InfoQ 作者【brave heart】的原创文章。
原文链接:【http://xie.infoq.cn/article/bdf8cebf7affe5d4403c5bc13】。文章转载请联系作者。
评论