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 相关文章推荐
Auntion-TableSort国人写的一个javascript表格排序的东西
Nov 12 Javascript
jQuery的.live()和.die() 使用介绍
Sep 10 Javascript
js实现上传图片之上传前预览图片
Mar 25 Javascript
jQuery封装的获取Url中的Get参数示例
Nov 26 Javascript
Js判断CSS文件加载完毕的具体实现
Jan 17 Javascript
javascript 获取元素样式必杀技
May 04 Javascript
webpack3+React 的配置全解
Aug 21 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
May 16 Javascript
jQuery实现参数自定义的文字跑马灯效果
Aug 15 jQuery
JS document对象简单用法完整示例
Jan 14 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
Apr 29 Javascript
vue大型项目之分模块运行/打包的实现
Sep 21 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
网页上facebook分享功能具体实现
2014/01/26 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
原生JS可拖动弹窗效果实例代码
2013/11/09 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
jQuery给多个不同元素添加class样式的方法
2015/03/26 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
js实现文字跑马灯效果
2017/02/23 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
原生JS实现动态添加新元素、删除元素方法
2019/05/05 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
[03:44]2015国际邀请赛选手档案—Cloud9.NoTail
2015/07/28 DOTA
[48:26]VGJ.S vs infamous Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
python爬虫租房信息在地图上显示的方法
2019/05/13 Python
Python帮你识破双11的套路
2019/11/11 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
Python selenium实现断言3种方法解析
2020/09/08 Python
Python 使用office365邮箱的示例
2020/10/29 Python
Java里面如何创建一个内部类的实例
2015/01/19 面试题
党员个人思想汇报
2013/12/28 职场文书
《可爱的动物》教学反思
2014/02/22 职场文书
春节联欢会主持词
2014/03/24 职场文书
卖车协议书
2014/04/21 职场文书
地理科学专业自荐信
2014/09/01 职场文书
2015年八一建军节慰问信
2015/03/23 职场文书
2015年医院药剂科工作总结
2015/05/04 职场文书
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
vue3获取当前路由地址
2022/02/18 Vue.js