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 三种编解码方式
Feb 01 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
Feb 02 Javascript
jquery动态添加option示例
Dec 30 Javascript
jQuery选择器源码解读(三):tokenize方法
Mar 31 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
Aug 30 Javascript
详解js中构造流程图的核心技术JsPlumb
Dec 08 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
Oct 11 Javascript
详解JavaScript的内置对象
Dec 07 Javascript
JavaScript实现百度搜索框效果
Mar 26 Javascript
vue路由传参三种基本方式详解
Dec 09 Javascript
Vue.js暴露方法给WebView的使用操作
Sep 07 Javascript
vue使用element-ui实现表单验证
Dec 13 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字符串中特殊符号的过滤方法介绍
2014/02/18 PHP
php文件夹的创建与删除方法
2015/01/24 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
PHP进阶学习之垃圾回收机制详解
2019/06/18 PHP
jQuery live
2009/05/15 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
jQuery 中国省市两级联动选择附图
2014/05/14 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
Javascript的动态增加类的实现方法
2016/10/20 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
React Native日期时间选择组件的示例代码
2018/04/27 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
详解用js代码触发dom事件的实现方案
2020/06/10 Javascript
简单分析Python中用fork()函数生成的子进程
2015/05/04 Python
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
postman传递当前时间戳实例详解
2019/09/14 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
Python图像读写方法对比
2020/11/16 Python
使用Python封装excel操作指南
2021/01/29 Python
纯CSS3实现移动端展开和收起效果的示例代码
2020/04/26 HTML / CSS
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
综合测评自我鉴定
2013/10/08 职场文书
自荐信的基本格式
2014/02/22 职场文书
中文教师求职信
2014/02/22 职场文书
车辆工程专业求职信
2014/04/28 职场文书
中华魂演讲稿
2014/05/13 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
离婚协议书范文2014
2014/10/16 职场文书
邀请函模板
2015/02/02 职场文书
员工工作表扬信
2015/05/05 职场文书
《秋思》教学反思
2016/02/23 职场文书