Vue中函数防抖节流的理解及应用实现


Posted in Javascript onApril 24, 2020

防抖和节流的目的都是为了减少不必要的计算,不浪费资源,只在适合的时候再进行触发计算。

一、函数防抖

定义
在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时;典型的案例就是输入搜索:输入结束后n秒才进行搜索请求,n秒内又输入的内容,就重新计时。

实现原理
函数防抖的基本思想是设置一个定时器,在指定时间间隔内运行代码时清楚上一次的定时器,并设置另一个定时器,知道函数请求停止并超过时间间隔才会执行。

使用场景
文本框输入搜索(连续输入时避免多次请求接口)

代码实现

/**
 * 函数防抖
 */
export function debounce(fn, delay) {
 // 记录上一次的延时器
 var timer = null;
 var delay = delay || 200;
 return function() {
  var args = arguments;
  var that = this;
  // 清除上一次延时器
  clearTimeout(timer)
  timer = setTimeout(function() {
    fn.apply(that,args)
  }, delay);
 }
}

二、函数节流

定义
规定在一个单位时间内,只能触发一次函数,如果这个单位时间内触发多次函数,只有一次生效; 典型的案例就是鼠标不断点击触发,规定在n秒内多次点击只有一次生效。

实现原理
其原理是用时间戳来判断是否已到回调该执行时间,记录上次执行的时间戳,然后每次触发 scroll 事件执行回调,回调中判断当前时间戳距离上次执行时间戳的间隔是否已经到达 规定时间段,如果是,则执行,并更新上次执行的时间戳,

使用场景

resize、scroll、mousemove等事件触发监听

代码实现

/**
 * 函数节流
 */
export function throttle(fn,delay){
 var lastTime;
 var timer;
 var delay = delay || 200;
 return function() {
  var args = arguments;
  // 记录当前函数触发的时间
  var nowTime = Date.now();
  if (lastTime && nowTime - lastTime < delay) {
   clearTimeout(timer);
   timer = setTimeout(function () {
    // 记录上一次函数触发的时间
    lastTime = nowTime;
    // 修正this指向问题
    fn.apply(this, args);
   }, delay);
  }else{
   lastTime = nowTime;
   fn.apply(this, args);
  }
 }
}

三、在Vue中使用函数防抖实现输入框搜索

效果图如下

Vue中函数防抖节流的理解及应用实现

新建common.js文件

/**
 * 函数防抖
 */
export function debounce(fn, delay) {
 // 记录上一次的延时器
 var timer = null;
 var delay = delay || 200;
 return function() {
  var args = arguments;
  var that = this;
  // 清除上一次延时器
  clearTimeout(timer)
  timer = setTimeout(function() {
    fn.apply(that,args)
  }, delay);
 }
}

在vue组件中引入

import {debounce} from '@/utils/common.js'

在组件中使用

<div class="white-search-bar">
    <div class="search-bar-item">
     <span class="iconfont icon-search"></span>
     <input class="search-bar-input" :class="{'search-bar-focus':isSearchFocus}" type="text" maxlength="8" placeholder="应用搜索" v-model="keyword" @keyup="appSearch" @focus="onSearchFocus" @blur="onSearchBlur">
    </div>
    <span class="search-bar-btn" @click="appSearchCancel" v-if="isSearchFocus">取消</span>
   </div>

methods:{
appSearch:debounce(function(){
  		 this.getAppList()
  	 },300)
}

参考阅读

https://www.jqhtml.com/20268.html

到此这篇关于Vue中函数防抖节流的理解及应用实现的文章就介绍到这了,更多相关Vue 函数防抖节流内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
js页面跳转的常用方法整理
Oct 18 Javascript
js中键盘事件实例简析
Jan 10 Javascript
JavaScript控制table某列不显示的方法
Mar 16 Javascript
JavaScript中setFullYear()方法的使用详解
Jun 11 Javascript
jQuery模拟黑客帝国矩阵效果实例
Jun 28 Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 Javascript
jQuery的ajax下载blob文件
Jul 21 Javascript
值得学习的bootstrap fileinput文件上传工具
Nov 08 Javascript
详解AngularJS中的表单验证(推荐)
Nov 17 Javascript
js自定义弹框插件的封装
Aug 24 Javascript
详谈表单重复提交的三种情况及解决方法
Aug 16 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
Dec 27 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
Apr 24 #Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
Apr 24 #Javascript
基于Vue实现微前端的示例代码
Apr 24 #Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
Apr 24 #Javascript
小程序开发之模态框组件封装
Apr 23 #Javascript
详解Vue3中对VDOM的改进
Apr 23 #Javascript
微信小程序实现滑动操作代码
Apr 23 #Javascript
You might like
PHP类和对象相关系统函数与运算符小结
2016/09/28 PHP
Js 导出table内容到Excel的简单实例
2013/11/19 Javascript
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
js对文章内容进行分页示例代码
2014/03/05 Javascript
JavaScript实现查找字符串中第一个不重复的字符
2014/12/29 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
搭建vscode+vue环境的详细教程
2020/08/31 Javascript
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
2014/01/19 Python
Python字典操作简明总结
2015/04/13 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
Python深入06——python的内存管理详解
2016/12/07 Python
python开发利器之ulipad的使用实践
2017/03/16 Python
python中数据爬虫requests库使用方法详解
2018/02/11 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
2018/04/22 Python
python爬取网页内容转换为PDF文件
2020/07/28 Python
python 求一个列表中所有元素的乘积实例
2019/06/11 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
计算机专业应届毕业生自荐信
2013/09/26 职场文书
财务总经理岗位职责
2014/02/16 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书
社区党建工作总结2015
2015/05/13 职场文书
家访教师心得体会
2016/01/23 职场文书
四年级语文教学反思
2016/03/03 职场文书
解决Python字典查找报Keyerror的问题
2021/05/26 Python