vue实现一个6个输入框的验证码输入组件功能的实例代码


Posted in Javascript onJune 29, 2020

vue实现一个6个输入框的验证码输入组件功能的实例代码

要实现的功能:

完全和单输入框一样的操作,甚至可以插入覆盖:

1,限制输入数字

2,正常输入

3,backspace删除

4,paste任意位置粘贴输入

5,光标选中一个数字,滚轮可以微调数字大小,限制0-9

6,123|456 自动覆盖光标后输入的字符,此时光标在3后,继续输入111,会得到123111,而不用手动删除456

7,封装成vue单文件组件,方便任意调用。

模板代码

<template>
  <div class="input-box">
    <div class="input-content" @keydown="keydown" @keyup="keyup" @paste="paste" @mousewheel="mousewheel"
        @input="inputEvent">
      <input max="9" min="0" maxlength="1" data-index="0" v-model.trim.number="input[0]" type="number"
          ref="firstinput"/>
      <input max="9" min="0" maxlength="1" data-index="1" v-model.trim.number="input[1]" type="number"/>
      <input max="9" min="0" maxlength="1" data-index="2" v-model.trim.number="input[2]" type="number"/>
      <input 
      <input max="9" min="0" maxlength="1" data-index="4" v-model.trim.number="input[4]" type="number"/>
      <input max="9" min="0" maxlength="1" data-index="5" v-model.trim.number="input[5]" type="number"/>
    </div>
  </div>
</template>

实现了键盘的keydown/keyup/paste/input和鼠标滚轮mousewheel事件

使用了6个输入框的方案来实现。

样式部分:使用了scss模式

<style scoped lang="scss">
  .input-box {
    .input-content {
      width: 512px;
      height: 60px;
      display: flex;
      align-items: center;
      justify-content: space-between;
      
      input {
        color: inherit;
        font-family: inherit;
        border: 0;
        outline: 0;
        border-bottom: 1px solid #919191;
        height: 60px;
        width: 60px;
        font-size: 44px;
        text-align: center;
      }
    }
    
    input::-webkit-outer-spin-button,
    input::-webkit-inner-spin-button {
      appearance: none;
      margin: 0;
    }
  }
</style>

具体实现逻辑:主要实现以上几个键盘事件操作。

<script>
  export default {
    data() {
      return {
        // 存放粘贴进来的数字
        pasteResult: [],
      };
    },
    props: ['code'],
    computed: {
      input() {
        // code 是父组件传进来的默认值,必须是6位长度的数组,这里就不再做容错判断处理
        // 最后空数组是默认值
        return this.code || this.pasteResult.length === 6 ? this.pasteResult : ['', '', '', '', '', '']
      }
    },
    methods: {
      // 解决一个输入框输入多个字符
      inputEvent(e) {
        var index = e.target.dataset.index * 1;
        var el = e.target;
        this.$set(this.input, index, el.value.slice(0, 1))
      },
      keydown(e) {
        var index = e.target.dataset.index * 1;
        var el = e.target;
        if (e.key === 'Backspace') {
          if (this.input[index].length > 0) {
            this.$set(this.input, index, '')
          } else {
            if (el.previousElementSibling) {
              el.previousElementSibling.focus()
              this.$set(this.input, index - 1, '')
            }
          }
        } else if (e.key === 'Delete') {
          if (this.input[index].length > 0) {
            this.$set(this.input, index, '')
          } else {
            if (el.nextElementSibling) {
              this.$set(this.input, index = 1, '')
            }
          }
          if (el.nextElementSibling) {
            el.nextElementSibling.focus()
          }
        } else if (e.key === 'Home') {
          el.parentElement.children[0] && el.parentElement.children[0].focus()
        } else if (e.key === 'End') {
          el.parentElement.children[this.input.length - 1] && el.parentElement.children[this.input.length - 1].focus()
        } else if (e.key === 'ArrowLeft') {
          if (el.previousElementSibling) {
            el.previousElementSibling.focus()
          }
        } else if (e.key === 'ArrowRight') {
          if (el.nextElementSibling) {
            el.nextElementSibling.focus()
          }
        } else if (e.key === 'ArrowUp') {
          if (this.input[index] * 1 < 9) {
            this.$set(this.input, index, (this.input[index] * 1 + 1).toString());
          }
        } else if (e.key === 'ArrowDown') {
          if (this.input[index] * 1 > 0) {
            this.$set(this.input, index, (this.input[index] * 1 - 1).toString());
          }
        }
      },
      keyup(e) {
        var index = e.target.dataset.index * 1;
        var el = e.target;
        if (/Digit|Numpad/i.test(e.code)) {
          this.$set(this.input, index, e.code.replace(/Digit|Numpad/i, ''));
          el.nextElementSibling && el.nextElementSibling.focus();
          if (index === 5) {
            if (this.input.join('').length === 6) {
              document.activeElement.blur();
              this.$emit('complete', this.input);
            }
          }
        } else {
          if (this.input[index] === '') {
            this.$set(this.input, index, '');
          }
        }
      },
      mousewheel(e) {
        var index = e.target.dataset.index;
        if (e.wheelDelta > 0) {
          if (this.input[index] * 1 < 9) {
            this.$set(this.input, index, (this.input[index] * 1 + 1).toString());
          }
        } else if (e.wheelDelta < 0) {
          if (this.input[index] * 1 > 0) {
            this.$set(this.input, index, (this.input[index] * 1 - 1).toString());
          }
        } else if (e.key === 'Enter') {
          if (this.input.join('').length === 6) {
            document.activeElement.blur();
            this.$emit('complete', this.input);
          }
        }
      },
      paste(e) {
        // 当进行粘贴时
        e.clipboardData.items[0].getAsString(str => {
          if (str.toString().length === 6) {
            this.pasteResult = str.split('');
            document.activeElement.blur();
            this.$emit('complete', this.input);
          }
        })
      }
    },
    mounted() {
      // 等待dom渲染完成,在执行focus,否则无法获取到焦点
      this.$nextTick(() => {
        this.$refs.firstinput.focus()
      })
    },
  }
</script>

如果你发现了bug,或者有优化空间,欢迎你的指正和建议。我会随时更新到原代码当中,分享给大家。

到此这篇关于vue实现一个6个输入框的验证码输入组件的文章就介绍到这了,更多相关vue实现输入框的验证码输入组件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
node.js中的console.timeEnd方法使用说明
Dec 09 Javascript
jQuery过滤选择器用法分析
Feb 10 Javascript
JQuery中Text方法用法实例分析
May 18 Javascript
微信小程序 网络API Websocket详解
Nov 09 Javascript
Vue.js展示AJAX数据简单示例讲解
Mar 29 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
Oct 17 Javascript
JS中的函数与对象的创建方式
May 12 Javascript
vue实现下拉加载其实没那么复杂
Aug 13 Javascript
解决微信小程序中的滚动穿透问题
Sep 16 Javascript
layui表格设计以及数据初始化详解
Oct 26 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
Nov 14 Javascript
JS事件循环机制event loop宏任务微任务原理解析
Aug 04 Javascript
纯JS开发baguetteBox.js响应式画廊插件
Jun 28 #Javascript
JavaScript图片旋转效果实现方法详解
Jun 28 #Javascript
javascript+css实现俄罗斯方块小游戏
Jun 28 #Javascript
详解小程序横屏方案对比
Jun 28 #Javascript
微信小程序实现上传多张图片、删除图片
Jul 29 #Javascript
js模拟实现百度搜索
Jun 28 #Javascript
微信小程序地图实现展示线路
Jul 29 #Javascript
You might like
PHP中设置一个严格30分钟过期Session面试题的4种答案
2014/07/30 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
详解PHP数组赋值方法
2015/11/07 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
用javascript来实现动画导航效果的代码
2007/12/16 Javascript
jQuery 版本的文本输入框检查器Input Check
2009/07/09 Javascript
js计算任意值之间随机数的方法
2015/01/16 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
vue 判断页面是首次进入还是再次刷新的实例
2020/11/05 Javascript
python基础教程之元组操作使用详解
2014/03/25 Python
python实现在sqlite动态创建表的方法
2015/05/08 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
Python线程同步的实现代码
2018/10/03 Python
Mac下Anaconda的安装和使用教程
2018/11/29 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
基于python实现生成指定大小txt文档
2020/07/20 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
HTML5计时器小例子
2013/10/15 HTML / CSS
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
大学生怎样进行自我评价
2013/12/07 职场文书
自主招生推荐信范文
2014/05/10 职场文书
工作感言一句话
2015/08/01 职场文书
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫