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 相关文章推荐
如何取得中文输入的真实长度?
Jun 24 Javascript
Javascript JSQL,SQL无处不在,
May 05 Javascript
js正文内容高亮效果的实现方法
Jun 30 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
Jan 02 Javascript
jQuery实现html表格动态添加新行的方法
May 28 Javascript
JS实现当前页居中分页效果的方法
Jun 18 Javascript
jQuery焦点图插件SaySlide
Dec 21 Javascript
javascript比较语义化版本号的实现代码
Sep 09 Javascript
React Native中的RefreshContorl下拉刷新使用
Oct 09 Javascript
AngularJS监听ng-repeat渲染完成的方法
Mar 20 Javascript
使用Node.js实现一个多人游戏服务器引擎
Mar 13 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
Jul 28 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和ACCESS写聊天室(四)
2006/10/09 PHP
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
Admin generator, filters and I18n
2011/10/06 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
使用Jquery来实现可以输入值的下拉选单 雏型
2011/12/06 Javascript
Javascript 5种方法实现过滤删除前后所有空格
2016/06/22 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
前端开发基础javaScript的六大作用
2020/08/06 Javascript
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
jQuery实现动态操作table行
2020/11/23 jQuery
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
[01:33:14]LGD vs VP Supermajor 败者组决赛 BO3 第二场 6.10
2018/07/04 DOTA
python实现折半查找和归并排序算法
2017/04/14 Python
python format 格式化输出方法
2018/07/16 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
2020/08/17 Python
Bowflex美国官方网站:高级家庭健身器材
2017/12/22 全球购物
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
ktv收银员岗位职责
2013/12/16 职场文书
经典而简洁的婚礼主持词
2014/03/13 职场文书
《天安门广场》教学反思
2014/04/23 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
安全生产标语
2014/06/06 职场文书
护理专科学生自荐书
2014/07/05 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书
考试作弊检讨书怎么写?
2014/12/21 职场文书
文艺节目主持词
2015/07/06 职场文书
聘任书范文大全
2015/09/21 职场文书
vue实现登陆页面开发实践
2022/05/30 Vue.js