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 相关文章推荐
JavaScript学习笔记(十)
Jan 17 Javascript
JavaScript中实现单体模式分享
Jan 29 Javascript
JavaScript获取网页表单提交方式的方法
Apr 02 Javascript
Wireshark基本介绍和学习TCP三次握手
Aug 15 Javascript
setTimeout学习小结
Feb 08 Javascript
ES6学习之变量的解构赋值
Feb 12 Javascript
详解js的视频和音频采集
Aug 09 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
Dec 04 Javascript
es6中let和const的使用方法详解
Feb 24 Javascript
Webpack5正式发布,有哪些新特性
Oct 12 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
Feb 26 Vue.js
JS精髓原型链继承及构造函数继承问题纠正
Jun 16 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
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
thinkPHP5框架接口写法简单示例
2019/08/05 PHP
laravel http 自定义公共验证和响应的方法
2019/09/29 PHP
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
ie 7/8不支持trim的属性的解决方案
2014/05/23 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
JavaScript中的时间处理小结
2016/02/24 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
js实现上下左右弹框划出效果
2017/03/08 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
Vue 技巧之控制父类的 slot
2020/02/24 Javascript
js实现简单选项卡制作
2020/08/05 Javascript
[01:08:56]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第一场 2月7日
2021/03/11 DOTA
python列表去重的二种方法
2014/02/14 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
tensorflow更改变量的值实例
2018/07/30 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
马克华菲官方商城:Mark Fairwhale
2016/09/04 全球购物
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
食品采购员岗位职责
2014/04/14 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
工程部经理岗位职责
2015/02/02 职场文书
答谢酒会主持词
2015/07/02 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
Java如何实现树的同构?
2021/06/22 Java/Android
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript