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中常用的SET和GET$(”#msg”).html循环介绍
Oct 09 Javascript
解决自定义$(id)的方法与jquery选择器$冲突的问题
Jun 14 Javascript
容易造成JavaScript内存泄露几个方面
Sep 04 Javascript
javascript实现当前页导航激活的方法
Feb 27 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
Sep 03 Javascript
jQuery事件用法详解
Oct 06 Javascript
JavaScript获取用户所在城市及地理位置
Apr 21 Javascript
微信小程序发送短信验证码完整实例
Jan 07 Javascript
vue+iview动态渲染表格详解
Mar 19 Javascript
Vue SPA 初次进入加载动画实现代码
Nov 14 Javascript
vue+animation实现翻页动画
Jun 29 Javascript
JS前后端实现身份证号验证代码解析
Jul 23 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
基于pear auth实现登录验证
2010/02/26 PHP
整理的一些实用WordPress后台MySQL操作命令
2013/01/07 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
php中如何执行linux命令详解
2018/11/06 PHP
详解PHP PDO简单教程
2019/05/28 PHP
js 动态加载事件的几种方法总结
2013/12/25 Javascript
node.js入门教程
2014/06/01 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
详解AngularJS 模块化
2017/06/14 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
解决jquery有正确返回值但不执行success函数的问题
2018/08/20 jQuery
Vue中的methods、watch、computed的区别
2018/11/26 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
p5.js临摹动态图形实现方法详解
2019/10/23 Javascript
在Django中创建动态视图的教程
2015/07/15 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
python分割列表(list)的方法示例
2017/05/07 Python
Python3爬虫mitmproxy的安装步骤
2020/07/29 Python
可能这些是你想要的H5软键盘兼容方案(小结)
2019/04/23 HTML / CSS
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
外语专业毕业生个人的自荐信
2013/11/19 职场文书
大学四年职业生涯规划书范文
2014/01/02 职场文书
《恐龙》教学反思
2014/04/27 职场文书
党员一帮一活动总结
2014/07/08 职场文书
未婚证明书模板
2014/10/08 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers