vue实现验证码输入框组件


Posted in Javascript onDecember 14, 2017

先来看波完成效果图

vue实现验证码输入框组件 

需求

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

实现步骤

第一步

布局排版

<div class="security-code-wrap">
 <label for="code">
  <ul class="security-code-container">
  <li class="field-wrap" v-for="(item, index) in number" :key="index">
   <i class="char-field">{{value[index] || placeholder}}</i>
  </li>
  </ul>
 </label>
 <input ref="input" class="input-code" @keyup="handleInput($event)" v-model="value"
   id="code" name="code" type="tel" :maxlength="number"
   autocorrect="off" autocomplete="off" autocapitalize="off">
</div>

使用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.value
 if (this.value.length >= this.number) {
  this.hideKeyboard()
 }
 this.handleSubmit()
}

输入时,给输入框赋一次值,是为了解决android端上输入框失焦后重新聚焦,输入光标会定在第一位的前面,经过赋值再聚焦,光标的位置就会显示在最后一位后面。

第三步

完成输入后关闭虚拟键盘

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

组件完整代码

<!--四位验证码输入框组件-->
<template>
 <div class="security-code-wrap">
 <label for="code">
  <ul class="security-code-container">
  <li class="field-wrap" v-for="(item, index) in number" :key="index">
   <i class="char-field">{{value[index] || placeholder}}</i>
  </li>
  </ul>
 </label>
 <input ref="input" class="input-code" @keyup="handleInput($event)" v-model="value"
   id="code" name="code" type="tel" :maxlength="number"
   autocorrect="off" autocomplete="off" autocapitalize="off">
 </div>
</template>
<script>
 export default {
 name: 'SecurityCode',
 // component properties
 props: {
  number: {
  type: Number,
  default: 4
  },
  placeholder: {
  type: String,
  default: '-'
  }
 },
 // variables
 data() {
  return {
  value: ''
  }
 },
 methods: {
  hideKeyboard() {
  // 输入完成隐藏键盘
  document.activeElement.blur() // ios隐藏键盘
  this.$refs.input.blur() // android隐藏键盘
  },
  handleSubmit() {
  this.$emit('input', this.value)
  },
  handleInput(e) {
  this.$refs.input.value = this.value
  if (this.value.length >= this.number) {
   this.hideKeyboard()
  }
  this.handleSubmit()
  }
 }
 }
</script>
<style scoped lang="less">
 .security-code-wrap {
 overflow: hidden;
 }
 .security-code-container {
 margin: 0;
 padding: 0;
 display: flex;
 justify-content: center;
 .field-wrap {
  list-style: none;
  display: block;
  width: 40px;
  height: 40px;
  line-height: 40px;
  font-size: 16px;
  background-color: #fff;
  margin: 2px;
  color: #000;
  .char-field {
  font-style: normal;
  }
 }
 }
 .input-code {
 position: absolute;
 left: -9999px;
 top: -99999px;
 width: 0;
 height: 0;
 opacity: 0;
 overflow: visible;
 z-index: -1;
 }
</style>

组件使用代码

<security-code v-model="authCode"></security-code>

总结

以上所述是小编给大家介绍的vue实现验证码输入框组件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JQuery-tableDnD 拖拽的基本使用介绍
Jul 04 Javascript
jQuery+easyui中的combobox实现下拉框特效
Feb 27 Javascript
javaScript中的原型解析【推荐】
May 05 Javascript
总结十个Angular.js由浅入深的面试问题
Aug 26 Javascript
JS得到当前时间的方法示例
Mar 24 Javascript
ES6新特性八:async函数用法实例详解
Apr 21 Javascript
Vuejs实现带样式的单文件组件新方法
May 02 Javascript
使用vue2实现购物车和地址选配功能
Mar 29 Javascript
vue 属性拦截实现双向绑定的实例代码
Oct 24 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
Apr 26 Javascript
jQuery实现放大镜案例
Oct 19 jQuery
JavaScript异步操作中串行和并行
Nov 20 Javascript
基于滚动条位置判断的简单实例
Dec 14 #Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
Dec 14 #Javascript
ES6/JavaScript使用技巧分享
Dec 14 #Javascript
Django与Vue语法的冲突问题完美解决方法
Dec 14 #Javascript
浅析JS抽象工厂模式
Dec 14 #Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
Dec 14 #Javascript
利用Javascript开发一个二维周视图日历
Dec 14 #Javascript
You might like
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
PHP类中Static方法效率测试代码
2010/10/17 PHP
php foreach 参数强制类型转换的问题
2010/12/10 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
动态加载iframe
2006/06/16 Javascript
摘自启点的main.js
2008/04/20 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
JQuery+DIV自定义滚动条样式的具体实现
2013/06/25 Javascript
被遗忘的javascript的slice() 方法
2015/04/20 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
2017/04/20 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
[04:11]DOTA2上海特级锦标赛主赛事首日TOP10
2016/03/03 DOTA
python处理Excel xlrd的简单使用
2017/09/12 Python
Python实现希尔排序算法的原理与用法实例分析
2017/11/23 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
python性能测量工具cProfile使用解析
2019/09/26 Python
Keras搭建自编码器操作
2020/07/03 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
简述安装Slackware Linux系统的过程
2012/05/08 面试题
2013年员工自我评价范文
2013/12/27 职场文书
数控个人求职信范文
2014/02/03 职场文书
学生会竞选演讲稿学习部
2014/08/25 职场文书
幼儿园园长新年寄语2015
2014/12/08 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
jQuery实现影院选座订座效果
2021/04/13 jQuery
python接口测试返回数据为字典取值方式
2022/02/12 Python
Java练习之潜艇小游戏的实现
2022/03/16 Java/Android