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 js 重置表单 reset()具体实现代码
Aug 05 Javascript
jQuery中hover方法和toggle方法使用指南
Feb 27 Javascript
js点击文本框弹出可选择的checkbox复选框
Feb 03 Javascript
JQuery DIV 动态隐藏和显示的方法
Jun 23 Javascript
javascript比较语义化版本号的实现代码
Sep 09 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
Dec 21 Javascript
jQuery实现淡入淡出的模态框
Feb 09 Javascript
Node.js创建Web、TCP服务器
Dec 05 Javascript
详解Angular6.0使用路由步骤(共7步)
Jun 29 Javascript
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
Aug 07 Javascript
es6函数之尾递归用法实例分析
Apr 25 Javascript
vue整合百度地图显示指定地点信息
Apr 06 Vue.js
基于滚动条位置判断的简单实例
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制作静态网站的模板框架(三)
2006/10/09 PHP
由php if 想到的些问题
2008/03/22 PHP
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
php遍历删除整个目录及文件的方法
2015/03/13 PHP
PHP实现的增强性mhash函数
2015/05/27 PHP
jquery 经典动画菜单效果代码
2010/01/26 Javascript
jQuery 添加/移除CSS类实现代码
2010/02/11 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
2015/04/16 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
js遍历获取表格内数据的方法(必看)
2017/04/06 Javascript
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
实现jquery放大镜的两种方法
2018/02/22 jQuery
React中this丢失的四种解决方法
2019/03/12 Javascript
layUI的验证码功能及校验实例
2019/10/25 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
简单介绍Python中的try和finally和with方法
2015/05/05 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
2017/11/24 Python
微信跳一跳游戏python脚本
2020/04/01 Python
Python实现Kmeans聚类算法
2020/06/10 Python
关于python写入文件自动换行的问题
2018/06/23 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
python将音频进行变速的操作方法
2020/04/08 Python
Python matplotlib可视化实例解析
2020/06/01 Python
意大利包包和行李箱销售网站:Bagaglio.it
2021/03/02 全球购物
高中历史教学反思
2014/02/08 职场文书
素质教育标语
2014/06/27 职场文书
2014年远程教育工作总结
2014/12/09 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
篮球拉拉队口号
2015/12/25 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书
Python集合的基础操作
2021/11/01 Python