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插件jbox使用iframe关闭问题
Feb 09 Javascript
javascript hasFocus使用实例
Jun 29 Javascript
使用GruntJS构建Web程序之构建篇
Jun 04 Javascript
Jquery焦点与失去焦点示例应用
Jun 10 Javascript
AngularJS入门教程之Hello World!
Dec 06 Javascript
Ionic如何实现下拉刷新与上拉加载功能
Jun 03 Javascript
js判断输入字符串是否为空、空格、null的方法总结
Jun 14 Javascript
浅谈js中对象的使用
Aug 11 Javascript
vue axios请求频繁时取消上一次请求的方法
Nov 10 Javascript
JS选取DOM元素常见操作方法实例分析
Dec 10 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
May 08 Javascript
JavaScript中的类型检查
Feb 03 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
再次研究下cache_lite
2007/02/14 PHP
php mysql数据库操作类
2008/06/04 PHP
PHP 遍历XP文件夹下所有文件
2008/11/27 PHP
php学习之简单计算器实现代码
2011/06/09 PHP
php生成图形(Libchart)实例
2013/11/06 PHP
JavaScript中valueOf函数与toString方法深入理解
2012/12/02 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
2017/07/09 Javascript
JavaScript实现短信倒计时60s
2017/10/09 Javascript
vue自定义指令实现方法详解
2019/02/11 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
2019/03/01 Javascript
微信小程序中转义字符的处理方法
2019/03/28 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
原生JS实现汇率转换功能代码实例
2020/05/13 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
2020/06/22 Javascript
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
python调用shell的方法
2013/11/20 Python
Django中使用locals()函数的技巧
2015/07/16 Python
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
python相似模块用例
2016/03/04 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
2018/11/30 Python
pandas的qcut()方法详解
2019/07/06 Python
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
质量月活动总结
2014/08/26 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
假释思想汇报范文
2014/10/11 职场文书
索赔员岗位职责
2015/02/15 职场文书
车辆管理制度范本
2015/08/05 职场文书
Python基础之字符串格式化详解
2021/04/21 Python
分析Netty直接内存原理及应用
2021/06/14 Java/Android
python中24小时制转换为12小时制的方法
2021/06/18 Python
Apache SkyWalking 监控 MySQL Server 实战解析
2022/09/23 Servers