这次记录的是一个类似移动端支付密码输入框组件的实现。当然,这种组件并不局限于在移动端使用,在PC端也可以使用,比如:在京东,淘宝下单输入支付密码时。
仓库地址
初步设计
既然要用来输入密码,那肯定是需要输入框的,假设默认输入位数是6位,那么需要准备6个输入框。
1 | <!-- pwd-inputs.vue --> |
1 | // pwd-inputs.vue |
1 | // pwd-inputs.vue |
初步完成后,我测试了一下组件,发现了有了个问题,(先不讨论这个组件如何与父组件进行数据交流)在移动端中,password的输入框都是有1-2秒的显示时间,也就是输入密码后,密码会有1-2秒的时间显示了你输入了什么。从输入体验上而言,如果是登录的密码输入这或许很不错,但是对于只有6位或者更短的密码而言,这就显得无太多意义了。所以下面将改造组件,并增加父子组件数据交流的方法。
查漏补缺
经过初步完成后的测试,我发现了以下几个问题
- 没有父子组件的数据交流。
- password输入框的输入体验问题。
那么针对以上这些问题,对组件进行升级。
1 | <!-- pwd-inputs.vue --> |
首先把模板中的input type改为 text
,增加一个 data
属性 input-index
1 | // pwd-inputs.vue |
既然password的输入框会有显示延迟,那么可以直接换成text的输入框。
为了方便控制input,增加一个当前聚焦的input的index,
并且密码数组由父组件通过prop传入组件中。
此外,还需要增加组件内的输入框输入事件响应方法,当有字符输入时,将输入的字符通过事自定义件传递到父组件。
1 | <!-- pwd-inputs.vue --> |
1 | // pwd-inputs.vue |
为了方便获取input的DOM元素,增加了一个引用名的数组,可以由外部组件传入,也可以使用默认的引用名。在input触发输入事件时,将输入后的变化通过自定义事件传递到父组件。
1 | <!-- parent-comp.vue --> |
1 | // parent-comp.vue |
除了上述的问题外,可能还缺少焦点控制的问题,所以还需要提供焦点控制的方法。
1 | // pwd-inputs.vue |
完善之后组件基本成型了,当然,还有一些别的功能暂时没有想到或者还不需要。
等有必要的时候会继续增加新功能。