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 相关文章推荐
javascript 学习笔记(一)DOM基本操作
Apr 08 Javascript
js模拟select下拉菜单控件的代码
May 08 Javascript
avascript中的自执行匿名函数应用示例
Sep 15 Javascript
JavaScript点击按钮后弹出透明浮动层的方法
May 11 Javascript
JS构造函数与原型prototype的区别介绍
Jul 04 Javascript
利用JavaScript阻止表单提交的两种方法
Aug 11 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
Oct 12 Javascript
ajax图片上传,图片异步上传,更新实例
Dec 30 Javascript
AngularJS的ng-click传参的方法
Jun 19 Javascript
JavaScript选择排序算法原理与实现方法示例
Aug 06 Javascript
mpvue项目中使用第三方UI组件库的方法
Sep 30 Javascript
一文读懂ES7中的javascript修饰器
May 06 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
SONY ICF-SW55的电路分析
2021/03/02 无线电
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
实例讲解php数据访问
2016/05/09 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
javascript设计模式之工厂模式示例讲解
2014/03/04 Javascript
JS删除字符串中重复字符方法
2014/03/09 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
jQuery中:image选择器用法实例
2015/01/03 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
jQuery.parseJSON()函数详解
2019/02/28 jQuery
vue项目出现页面空白的解决方案
2019/10/31 Javascript
vue中的使用token的方法示例
2020/03/10 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
python模块smtplib学习
2018/05/22 Python
python for循环输入一个矩阵的实例
2018/11/14 Python
Python实现DDos攻击实例详解
2019/02/02 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
Python基于httpx模块实现发送请求
2020/07/07 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
兰蔻法国官方网站:Lancôme法国
2020/02/22 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
大学专科自荐信
2014/06/17 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
务工证明怎么写
2015/06/18 职场文书
新郎父母婚礼答谢词
2015/09/29 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书
详解python的内存分配机制
2021/05/10 Python
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript