vue实现手机号码的校验实例代码(防抖函数的应用场景)


Posted in Javascript onSeptember 05, 2019

前言

上一篇博文我们讲到了节流函数的应用场景,我们知道了节流函数可以用在模糊查询、scroller、onresize等场景;今天这篇我们来讲防抖函数的应用场景::

通过上一篇博文的学习,我们知道了防抖函数的原理:只有在事件触发的时候才会延迟加载,如果在延迟加载之前再次触发,则会刷新延迟时间重新延迟,触发次数有且只有触发一次;

如果对防抖函数原理有疑惑,请点击链接跳转到关于防抖函数讲解的博文:https://3water.com/article/169350.htm

防抖函数一般是用于频繁触发事件,而我们只需要它触发一次的场景,比如:输入框的oninput事件、button按钮点击事件、点赞等操作场景;

今天我们讲的demo场景是防抖函数实现手机号码校验:

HTML视图层代码:

<div id="app">
  <input type="text" placeholder="请输入手机号码" v-model="val" @keyup="check"/>
  <div class="box" v-show="statu==true">您输入的手机号码格式正确</div>
 </div>

首先我们视图层代码是一个输入框后面加上一个div作为提示信息,HTML代码很简单就不过多讲解了;

JS数据逻辑层代码:

//这里我们要引入一个文件,文件里面是防抖函数的是实现
<script src="test.js"></script>
 <script>
 // 实例化 vue对象
  new Vue({
   el:"#app",
   data:{




//val是双向数据绑定绑定输入框的值
    val:"",




//此处状态值是根据状态值的变化来修改后面div的提示信息
    statu:false
   },
  mounted(){

  },
  methods:{




//check是我们绑定的输入框的@keyup事件,注意这里不能是函数,不然不会触发,必须要是对象
   check:debounce(function(){





//这里是我们调用方法,也就是我们要做的事情
    this.handle();
    console.log(new Date())
    }),
    handle(){





//此处输入是为了统计handle事件触发的次数
     console.log(“函数防抖”);
     //这里定义校验规则
     let reg = /^1[3|4|5|7|8][0-9]{9}$/; 
     //校验手机号规则





 //如果校验不通过会返回false,如果校验通过会返回true
     if(reg.test(this.val)){







//修改状态值方便上面的视图层判断展示
      this.statu=true;







//动态的修改提示信息
      document.getElementsByClassName("box").innerHTML="您输入的手机号码格式错误";
     }else{
      this.statu=false;
      document.getElementsByClassName("box").innerHTML="您输入的手机号码格式错误";
     }
    },
  }
 })

test.js

function debounce(fn) { //默认300毫秒
  var timer;
  return function() {
   if(timer) {
    clearTimeout(timer);
   }
   timer = setTimeout(() => {



定时器必须要更改this指向,可以用apply、bind、或者上面用变量转换等方式来进行更改this指向


    fn.apply(this); // this 指向vue
   }, 1000);
  };
 }

最后,我们的效果图如下(这里只是简单的模拟效果,视图层搭建的不是很美观):

vue实现手机号码的校验实例代码(防抖函数的应用场景)

 

我们可以看到我们打印的结果只输出了一次,如果不使用防抖函数,这里是会触发11次的,因为一共输入了11个字符;假设我们的方法体中是发送ajax和操作DOM呢?为了一个手机号码校验,难道我们要进行11次甚至更多次的ajax请求或者DOM操作吗?如果是那样,我们的程序性能可想而知,所以说防抖函数是一种性能提升方案;

上述讲述的是我们之前常见的cdn方式引入vue,那么我们如何在vue-cli脚手架中使用防抖函数来进行提升性能呢?

vue-cli:

首先我们可以在build文件夹中新建一个js文件,这里我们定义common.js:

common.js

// 函数防抖
export function debounce(fn, delay) {
 // 记录上一次的延时器
 var timer = null;
 var delay = delay || 200;
 return function() {
 // var args = arguments;
  var that = this;
  // 清除上一次延时器
  clearTimeout(timer)
  timer = setTimeout(function() {
   fn.apply(that)
  }, delay);
 }
 }

注意:我们在vue-cli中自定义方法必须要export抛出,不然组件读取不到

然后我们到我们需要用的文件中来进行引入和使用:

需要使用的组件:

import {debounce} from "../../build/common"

有抛出就一定有引入,我们这里用import来引用common.js文件里面的方法,这里的debounce就是我们用来接收common.js里面方法的变量;

调用方式跟上面的一样:

这里的search是视图层绑定的触发事件,注意这里也需要是对象的形式来调用
methods:{
 Search:debounce(function(){console.log(1234);},1000), 
}

总结:

1、防抖函数和节流函数均属于一种性能优化方案,有效的使用可以提升程序性能,提升用户体验;

2、防抖函数可适用于点赞、输入框校验、取消点赞、创建订单等不可让用户同一时间内频繁进行操作的场景;

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
IE 缓存策略的BUG的解决方法
Jul 21 Javascript
正则表达式优化JSON字符串的技巧
Dec 24 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
Sep 16 Javascript
微信小程序封装http访问网络库实例代码
May 24 Javascript
基于vue实现swipe分页组件实例
May 25 Javascript
浅谈关于.vue文件中style的scoped属性
Aug 19 Javascript
利用pm2部署多个node.js项目的配置教程
Oct 22 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
Oct 26 Javascript
开发Vue树形组件的示例代码
Dec 21 Javascript
原生js实现针对Dom节点的CRUD操作示例
Aug 26 Javascript
js滚轮事件 js自定义滚动条的实现
Jan 18 Javascript
详细聊聊vue中组件的props属性
Nov 02 Vue.js
一文看懂如何简单实现节流函数和防抖函数
Sep 05 #Javascript
React路由鉴权的实现方法
Sep 05 #Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
Sep 05 #Javascript
layer.open的自适应及居中及子页面标题的修改方法
Sep 05 #Javascript
在layui中layer弹出层点击事件无效的解决方法
Sep 05 #Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
Sep 05 #Javascript
JavaScript基础之this和箭头函数详析
Sep 05 #Javascript
You might like
php 图片上添加透明度渐变的效果
2009/06/29 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
JavaScript 事件参考手册
2008/12/24 Javascript
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
jQuery图片预加载 等比缩放实现代码
2011/10/04 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
以BootStrap Tab为例写一个前端组件
2017/07/25 Javascript
node爬取新型冠状病毒的疫情实时动态
2020/02/06 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
python的id()函数解密过程
2012/12/25 Python
python学习手册中的python多态示例代码
2014/01/21 Python
Python采用Django制作简易的知乎日报API
2016/08/03 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
python实现LRU热点缓存及原理
2019/10/29 Python
如何通过Django使用本地css/js文件
2020/01/20 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
美国农场商店:Blain’s Farm & Fleet
2020/01/17 全球购物
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
毕业典礼邀请函
2015/01/31 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
2015年个人实习工作总结
2015/05/28 职场文书
自愿离婚协议书范本2016
2016/03/18 职场文书