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 相关文章推荐
jValidate 基于jQuery的表单验证插件
Dec 12 Javascript
img onload事件绑定各浏览器均可执行
Dec 19 Javascript
extjs3 combobox取value和text案例详解
Feb 06 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
Mar 08 Javascript
JS清除字符串中重复值的实现方法
Aug 03 Javascript
jQuery查找节点并获取节点属性的方法
Sep 09 Javascript
Jquery实现上下移动和排序代码
Oct 17 Javascript
JavaScript使用readAsDataUrl方法预览图片
May 10 Javascript
ES6入门教程之Iterator与for...of循环详解
May 17 Javascript
layui中layer前端组件实现图片显示功能的方法分析
Oct 13 Javascript
如何实现小程序tab栏下划线动画效果
May 18 Javascript
vue实现水波涟漪效果的点击反馈指令
May 31 Vue.js
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遍历并打印指定目录下所有文件实例
2014/02/10 PHP
PHP实现的购物车类实例
2015/06/17 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
在实例中重学JavaScript事件循环
2020/12/03 Javascript
python 参数列表中的self 显式不等于冗余
2008/12/01 Python
浅谈Python 字符串格式化输出(format/printf)
2016/07/21 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
解决Python设置函数调用超时,进程卡住的问题
2019/08/08 Python
Python2与Python3的区别点整理
2019/12/12 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
特步官方商城:Xtep
2017/03/21 全球购物
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
几道Web/Ajax的面试题
2016/11/05 面试题
大学生创业项目方案
2014/03/08 职场文书
运动会标语
2014/06/21 职场文书
工作证明英文模板
2014/10/21 职场文书
党员考试作弊检讨书1000字
2015/02/16 职场文书
地球一小时活动总结
2015/02/27 职场文书
辞职信的写法
2015/02/27 职场文书
聘用合同范本
2015/09/21 职场文书
新入职员工工作总结
2015/10/15 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
python读取mnist数据集方法案例详解
2021/09/04 Python
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS
我去timi了,一起去timi是什么意思?
2022/04/13 杂记
数据设计之权限的实现
2022/08/05 MySQL