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 相关文章推荐
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
Feb 05 Javascript
ArrayList类(增强版)
Apr 04 Javascript
JavaScript的RequireJS库入门指南
Jul 01 Javascript
JavaScript Split()方法
Dec 18 Javascript
jQuery防止重复绑定事件的解决方法
May 14 Javascript
Node.js测试中的Mock文件系统详解
Nov 21 Javascript
原生js实现addclass,removeclass,toggleclasss实例
Nov 24 Javascript
Vue 短信验证码组件开发详解
Feb 14 Javascript
js取小数点后两位四种方法
Jan 18 Javascript
详解jQuery-each()方法
Mar 13 jQuery
vue+element UI实现树形表格带复选框的示例代码
Apr 16 Javascript
vue+ts下对axios的封装实现
Feb 18 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
PHP 图片上传实现代码 带详细注释
2010/04/29 PHP
PHP filter_var() 函数 Filter 函数
2012/04/25 PHP
php实现的返回数据格式化类实例
2014/09/22 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
javascript 面向对象编程基础 多态
2009/08/21 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
JavaScript开发者必备的10个Sublime Text插件
2016/02/27 Javascript
JavaScript中的prototype原型学习指南
2016/05/09 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
2017/05/01 jQuery
Node.js编写CLI的实例详解
2017/05/17 Javascript
基于vue的短信验证码倒计时demo
2017/09/13 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
微信小程序实现提交input信息到后台的方法示例
2019/01/19 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
详解用Webpack与Babel配置ES6开发环境
2019/03/12 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
Python导入txt数据到mysql的方法
2015/04/08 Python
Django实现学生管理系统
2019/02/26 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
Django ModelForm组件使用方法详解
2019/07/23 Python
python 爬取学信网登录页面的例子
2019/08/13 Python
Python threading的使用方法解析
2019/08/28 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
tensorflow与numpy的版本兼容性问题的解决
2021/01/08 Python
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
100%法国制造的游戏和玩具:Les Jouets Français
2021/03/02 全球购物
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
小学副班长竞选稿
2015/11/21 职场文书