效果图

功能分解

  • 输入效果
  • 自动换焦
  • 如何删除
  • 接收paste事件

数据先行

  • 确定验证码位数 amout
  • 储存验证码的数组 code
  • 当前输入项的索引 currentIndex

布局

<template><div class="ys-verification"><div class="input-wrapper" v-for="item in amount" :key="item"><input type="number"  @paste="handlePaste" title="code" v-focus="(item - 1) === currentIndex" maxlength="1" @input="handleInput($event,(item-1))" @keyup.delete="onDelete($event,(item-1))"  v-model="code[item-1]"></div></div>
</template>

初始化code

  created () {this.code = new Array(this.amount).fill('')},

如何实现自动换焦

A: 采用自定义指令实现
正如模板代码中展示的那样,为每一个input绑定了一个v-focus指令

  directives: {focus: {componentUpdated: function (el, obj) {obj.value && el.focus()}}},

我们传入一个boolean值控制当前项是否获得焦点。
而Boolean值是由 (item - 1) === currentIndex 决定,因此我们只需要修改currentIndex的值便可以实现自动换焦.

在哪里修改currentIndex

可以给Input绑定一个input事件,输入一位数字之后就让currentIndex + 1

 methods: {handleInput (e, index) {this.currentIndex = indexe.target.value = this.validateNumber(e.target.value)e.target.value !== '' && ++this.currentIndex!this.code.includes('') && this.$emit('onCompleted', this.code.join(''))},validateNumber (val) {return val.replace(/\D/g, '')},

怎么删除

我们监听键盘事件,使用vue的别名。删除之后退格。

@keyup.delete="onDelete($event,(item-1))"
//...
onDelete (e, index) {if (e.target.value === '') {this.currentIndex = index - 1 }},

粘贴

后来有了新需求,要求能够粘贴。
but,
我不能获取到Item的值,就很难受。
所以就没搞定,就简直粘贴了。
然而,有的手机还是能够粘贴

    handlePaste (e) {e.preventDefault()}

源码

<template><div class="ys-verification"><div class="input-wrapper" v-for="item in amount" :key="item"><input type="number"  @paste="handlePaste" title="code" v-focus="(item - 1) === currentIndex" maxlength="1" @input="handleInput($event,(item-1))" @keyup.delete="onDelete($event,(item-1))"  v-model="code[item-1]"></div></div>
</template><script>
export default {name: 'VerificationCodeInput',props: {amount: {type: Number,default: 4}},directives: {focus: {componentUpdated: function (el, obj) {obj.value && el.focus()}}},created () {this.code = new Array(this.amount).fill('')},methods: {handleInput (e, index) {this.currentIndex = indexe.target.value = this.validateNumber(e.target.value)e.target.value !== '' && ++this.currentIndex!this.code.includes('') && this.$emit('onCompleted', this.code.join(''))},onDelete (e, index) {if (e.target.value === '') {this.currentIndex = index - 1}},validateNumber (val) {return val.replace(/\D/g, '')},handlePaste (e) {e.preventDefault()}},data () {return {code: [],currentIndex: 0}}
}
</script><style lang="less" scoped>.ys-verification{width:100%;display: flex;justify-content: space-around;.input-wrapper{border-bottom: 1px solid #D6D6D6;width: 15%;height: 0;padding-bottom:20%;position: relative;input{position: absolute;width: 100%;height: 100%;text-align: center;transition: all 0.3s;font-size: 7vw;color: #333333;}}input:focus{border-bottom: 1px solid #666666;}}
</style>

Vue - 实现验证码输入组件相关推荐

  1. 基于 Vue2.0 的移动端 / PC 端验证码输入组件.

    vue-input-code 基于Vue2.0的移动端验证码输入组件. 功能预览 输入回调 完成回调 自定义验证码个数 样式可控 这里是可爱的Demo 支持 支持 Vue.js 2.0+. 安装和使用 ...

  2. vue实现验证码输入

    需求:这种样式的验证码输入,进入页面时光标停留在第一个格子,随着输入的数字向后移动. 实现逻辑: ①首先考虑样式,将六个格子及获取光标的样式写出来. ②需要一个input框作为输入,所以在页面上加in ...

  3. vue 实现动态增加输入框_vue实现一个6个输入框的验证码输入组件

    要实现的功能: 完全和单输入框一样的操作,甚至可以插入覆盖: 1,限制输入数字 2,正常输入 3,backspace删除 4,paste任意位置粘贴输入 5,光标选中一个数字,滚轮可以微调数字大小,限 ...

  4. vue 获取验证码倒计时组件

    之前写过一个计时函数,有计算误差,但是验证码的60秒倒计时可以忽略这一点点误差.直接上代码. <template><div class="captcha-row" ...

  5. Vue 表情包输入组件

    Emotion 一个用于vue的表情输入组件 https://gitee.com/jiangliyue/vue_expression_input_module.git index是使用示例,emoti ...

  6. 基于 vue 的验证码组件

    登录页面有个验证码,暂时没用到后台,在网上找了两个博客,记录一下. 一.直接写(参考-UIEngineer) 这个样式比较简单,直接在需要验证码的地方添加就行了.如果这个页面比较复杂,用组件会比较好. ...

  7. 如何封装一个vue组件(获取手机验证码的组件)

    如何封装一个vue组件(获取手机验证码的组件) 定义一个名为 item-time 的新组件,这是获取手机验证码的组件 Vue.component('item-time', {props: ['maxt ...

  8. Vue 表情输入组件,微信face表情组件

    VUE表情包输入组件,先来张成品图看看. 年底了没事干,把以前做过的项目中的组件拿出来再复习一下, 先说说思路吧. 注意: 1. 项目是用vue-cli3.0搭建起来的项目, 参考cli3.0官网地址 ...

  9. 使用vue创建一个遮罩组件_用于输入遮罩的另一个Vue组件

    使用vue创建一个遮罩组件 语音输入蒙版 (vue-input-mask) Yet another Vue component for input masking. Based on react-in ...

最新文章

  1. DeepMind科学家:AI对战《星际争霸》胜算几何?
  2. Codeforces Global Round 9 A-D题解
  3. goaccess在定时任务中不执行的问题
  4. 安卓惯性传感器(一)
  5. MySQL中如何通过修改表实现约束的添加与删除
  6. python命名空间特性_Python命名空间与作用域
  7. QT5.10.0安装教程图文教程以及安装成功QT5.10.0后环境配置图文步骤
  8. kotlin dsl_Spring Webflux – Kotlin DSL –实现的演练
  9. php$this-conn可以不先定义吗,CodeIgniter 是不是支持PDO 查询?还是本来就不支持
  10. HDUacm2095
  11. LaTex常用特殊符号对应表
  12. Word文档的基本操作
  13. windows7系统,ping本机ip地址请求超时的解决方案
  14. 曾经沧海难为水,除却巫山不是云。
  15. 一文了解巨量引擎的买量产品矩阵:巨量云图、巨量方舟、巨量广告、巨量纵横
  16. 如何做人群画像 如何做用户画像
  17. 正则表达式—————根据银行卡号判断银行名称
  18. 通过“偷”的方式对网站进行推广
  19. 随机点名器1(Java数组基础)
  20. 丢失宠物发布找寻平台

热门文章

  1. 数组截取之 slice() 方法
  2. 游戏陪玩app软件开发,这些功能你需要,一定要知道
  3. Shell编程之函数与数组
  4. wordpress标签大全
  5. Spring+Mybatis+SpringMVC+Maven+MySql(SSM框架)搭建实例
  6. 云计算、IaaS、PaaS、SaaS概念学习
  7. [ubuntu]Chrome浏览器无法登录Google账号
  8. 完美解决IEEE latex模板表格caption字体不大写的问题
  9. 支持avi mkv的html视频插件,轻型智能云存储 N2家庭云盘探索区块链新路径
  10. 图谱实战 | 图谱问答在小米小爱中的实践探索