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 相关文章推荐
ExtJS 2.0实用简明教程 之获得ExtJS
Apr 29 Javascript
微信JS接口汇总及使用详解
Jan 09 Javascript
JS获取地址栏参数的两种方法(简单实用)
Jun 14 Javascript
微信小程序 Record API详解及实例代码
Sep 30 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
Sep 21 Javascript
JS执行控制之节流模式实例分析
Dec 21 Javascript
Vue CLI3中使用compass normalize的方法
May 30 Javascript
Layui table field初始化加载时进行隐藏的方法
Sep 19 Javascript
Vue 实现登录界面验证码功能
Jan 03 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
Mar 06 Javascript
如何手动实现一个 JavaScript 模块执行器
Oct 16 Javascript
如何在面试中手写出javascript节流和防抖函数
Oct 22 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
DC动画很好看?新作烂得令人发指,名叫《红色之子》
2020/04/09 欧美动漫
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
PHP生成随机密码类分享
2014/06/25 PHP
PHP的拦截器实例分析
2014/11/03 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
JavaScript中的面向对象介绍
2012/06/30 Javascript
json原理分析及实例介绍
2012/11/29 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
Js控制弹窗实现在任意分辨率下居中显示
2013/08/01 Javascript
javascript文件加载管理简单实现方法
2015/07/25 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
js获取指定时间的前几秒
2017/04/05 Javascript
js 获取今天以及过去日期
2017/04/11 Javascript
基于vue实现swipe轮播组件实例代码
2017/05/24 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
代码详解JS操作剪贴板
2018/02/11 Javascript
js尾调用优化的实现
2019/05/23 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
Vue实现手机计算器
2020/08/17 Javascript
Python理解递归的方法总结
2019/01/28 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
python 解决cv2绘制中文乱码问题
2019/12/23 Python
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
出纳员岗位职责
2014/03/13 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
英文道歉信
2015/01/20 职场文书
新闻稿怎么写
2015/07/18 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
创业项目大全(适合在家创业的项目)
2019/08/15 职场文书
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers