angular.js和vue.js中实现函数去抖示例(debounce)


Posted in Javascript onJanuary 18, 2018

问题描述

搜索输入框中,只当用户停止输入后,才进行后续的操作,比如发起Http请求等。

学过电子电路的同学应该知道按键防抖。原理是一样的:就是说当调用动作n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间。本文将分别探讨在angular.js和vue.js中如何实现对用户输入的防抖。

angular.js中解决方案

把去抖函数写成一个service,方便多处调用:

.factory('debounce', ['$timeout','$q', function($timeout, $q) {
  // The service is actually this function, which we call with the func
  // that should be debounced and how long to wait in between calls
  return function debounce(func, wait, immediate) {
   var timeout;
   // Create a deferred object that will be resolved when we need to
   // actually call the func
   var deferred = $q.defer();
   return function() {
    var context = this, args = arguments;
    var later = function() {
     timeout = null;
     if(!immediate) {
      deferred.resolve(func.apply(context, args));
      deferred = $q.defer();
     }
    };
    var callNow = immediate && !timeout;
    if ( timeout ) {
     $timeout.cancel(timeout);
    }
    timeout = $timeout(later, wait);
    if (callNow) {
     deferred.resolve(func.apply(context,args));
     deferred = $q.defer();
    }
    return deferred.promise;
   };
  };
 }])

调用方法,在需要使用该功能的controller/directive中注入debounce,也要注入$watch,然后:

$scope.$watch('searchText',debounce(function (newV, oldV) {
  console.log(newV, oldV);
  if (newV !== oldV) {
    $scope.getDatas(newV);
  }
}, 350));

大功告成!

Vue.js中的解决方案

首先在公共函数文件中注册debounce

export function debounce(func, delay) {
 let timer

 return function (...args) {
  if (timer) {
   clearTimeout(timer)
  }
  timer = setTimeout(() => {
   func.apply(this, args)
  }, delay)
 }
}

然后在需要使用的组件中引入debounce,并且在created生命周期内调用:

created() {
 this.$watch('searchText', debounce((newSearchText) => {
  this.getDatas(newSearchText)
 }, 200))
}

大功告成!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js实现一个省市区三级联动选择框代码分享
Mar 06 Javascript
EasyUI实现二级页面的内容勾选的方法
Mar 01 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
Apr 02 Javascript
纯JS实现旋转图片3D展示效果
Apr 12 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
May 25 Javascript
JS拖拽插件实现步骤
Aug 03 Javascript
JavaScript使用键盘输入控制实现数字验证功能
Aug 19 Javascript
jquery层级选择器的实现(匹配后代元素div)
Sep 05 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
Jan 30 Javascript
fullpage.js最后一屏滚动方式
Feb 06 Javascript
webpack4之SplitChunksPlugin使用指南
Jun 12 Javascript
微信小程序实现拍照和相册选取图片
May 09 Javascript
vue-scroller记录滚动位置的示例代码
Jan 17 #Javascript
基于vue监听滚动事件实现锚点链接平滑滚动的方法
Jan 17 #Javascript
详解微信小程序审核不通过的解决方法
Jan 17 #Javascript
swiper动态改变滑动内容的实现方法
Jan 17 #Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
Jan 17 #Javascript
使用Vue开发一个实时性时间转换指令
Jan 17 #Javascript
angularjs 页面自适应高度的方法
Jan 17 #Javascript
You might like
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
php通过文件流方式复制文件的方法
2015/03/13 PHP
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
Jquery选择子控件"大于号"和" "区别介绍及使用示例
2013/06/25 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
jQuery基于ajax实现星星评论代码
2015/08/07 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
2016/07/24 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
JS点击缩略图整屏居中放大图片效果
2017/07/04 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
浅谈Webpack 持久化缓存实践
2018/03/22 Javascript
Python进阶篇之字典操作总结
2016/11/16 Python
对Python中gensim库word2vec的使用详解
2018/05/08 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
详解numpy矩阵的创建与数据类型
2019/10/18 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
H5 canvas中width、height和style的宽高区别详解
2018/11/02 HTML / CSS
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
军训考核自我鉴定
2014/02/13 职场文书
幼儿园教师求职信
2015/03/20 职场文书
心术观后感
2015/06/11 职场文书
哈姆雷特读书笔记
2015/06/29 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书
2019年教师节:送给所有老师的祝福语
2019/09/05 职场文书
python opencv旋转图片的使用方法
2021/06/04 Python
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers
Zabbix对Kafka topic积压数据监控的解决方案
2022/07/07 Servers