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类中获取外部函数名的方法与代码
Sep 12 Javascript
jQuery 判断页面元素是否存在的代码
Aug 14 Javascript
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
Apr 04 Javascript
jQuery中$.extend()用法实例
Jun 24 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
Aug 10 Javascript
JSP防止网页刷新重复提交数据的几种方法
Nov 19 Javascript
Bootstrap导航条的使用和理解3
Dec 14 Javascript
jquery实现手机端单店铺购物车结算删除功能
Feb 22 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
Mar 27 Javascript
Node.JS文件系统解析实例详解
May 15 Javascript
vue组件实现弹出框点击显示隐藏效果
Oct 26 Javascript
Layui多选只有最后一个值的解决方法
Sep 02 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 观察者模式的实现代码
2013/05/10 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
用js重建星际争霸
2006/12/22 Javascript
javascript radio 联动效果
2009/03/04 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
js实现右键自定义菜单
2016/12/03 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
深入理解Angularjs 脏值检测
2018/10/12 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
2020/08/31 Javascript
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
python的setattr函数实例用法
2020/12/16 Python
HTML5混合开发二维码扫描以及调用本地摄像头
2017/12/27 HTML / CSS
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
C++如何引用一个已经定义过的全局变量
2014/08/25 面试题
日语系毕业生推荐信
2013/11/11 职场文书
愚人节活动策划方案
2014/03/11 职场文书
捐资助学倡议书
2014/04/15 职场文书
运动会口号8字
2014/06/07 职场文书
国际商务英语专业求职信
2014/07/08 职场文书
班组长安全工作职责
2014/07/15 职场文书
学校国庆节活动总结
2015/03/23 职场文书
2016年“5.12”护士节致辞
2015/07/31 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
Python几种酷炫的进度条的方式
2022/04/11 Python