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 相关文章推荐
Jquery下:nth-child(an+b)的使用注意
May 28 Javascript
Javascript/Jquery——简单定时器的多种实现方法
Jul 03 Javascript
jquery配合css简单实现返回顶部效果
Sep 30 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
Oct 22 Javascript
深入分析JQuery和JavaScript的异同
Oct 23 Javascript
详解jquery事件delegate()的使用方法
Jan 25 Javascript
Vue.js实战之Vuex的入门教程
Apr 01 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
Sep 18 Javascript
详解vue 自定义marquee无缝滚动组件
Apr 09 Javascript
JS实现指定区域的全屏显示功能示例
Apr 25 Javascript
ant design实现圈选功能
Dec 17 Javascript
Vue实现todo应用的示例
Feb 20 Vue.js
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音乐采集(部分代码)
2007/02/14 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
2011/07/03 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
PHP二维关联数组的遍历方式(实例讲解)
2017/10/18 PHP
js css样式操作代码(批量操作)
2009/10/09 Javascript
jquery 输入框数字限制插件
2009/11/10 Javascript
Javascript动态引用CSS文件的2种方法介绍
2014/06/06 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
dedecms页面如何获取会员状态的实例代码
2016/03/15 Javascript
jQuery实现的表格展开伸缩效果实例
2016/09/07 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
jQuery 利用ztree实现树形表格的实例代码
2017/09/27 jQuery
Webpack打包字体font-awesome的方法示例
2018/04/26 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
python多重继承实例
2014/10/11 Python
Python实现各种排序算法的代码示例总结
2015/12/11 Python
实例讲解Python中SocketServer模块处理网络请求的用法
2016/06/28 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
Python基于smtplib模块发送邮件代码实例
2020/05/29 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
Python如何操作docker redis过程解析
2020/08/10 Python
加拿大领先家居家具网上购物:Aosom.ca
2020/05/27 全球购物
学年自我鉴定
2014/01/16 职场文书
标准的毕业生自荐信
2014/04/20 职场文书
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
《蓝鲸的眼睛》读后感5篇
2020/01/15 职场文书
CSS3新特性详解(五):多列columns column-count和flex布局
2021/04/30 HTML / CSS
Python+腾讯云服务器实现每日自动健康打卡
2021/12/06 Python
详解MySQL的内连接和外连接
2023/05/08 MySQL