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 相关文章推荐
关于jquery性能最佳实践的讨论,与求教
Mar 30 Javascript
js操作XML文件的实现方法兼容IE与FireFox
Jun 25 Javascript
由浅入深剖析Angular表单验证
Jul 14 Javascript
如何制作幻灯片(代码分享)
Jan 06 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
Feb 24 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
Sep 06 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
Feb 27 Javascript
jQuery控制input只能输入数字和两位小数的方法
May 16 jQuery
vue实现搜索过滤效果
May 28 Javascript
分享JS表单验证源码(带错误提示及密码等级)
Jan 05 Javascript
浅析Vue 中的 render 函数
Feb 28 Javascript
nuxt 实现在其它js文件中使用store的方式
Nov 05 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压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
eval的两组性能测试数据
2012/08/17 Javascript
使用js对select动态添加和删除OPTION示例代码
2013/08/12 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
2013/12/18 Javascript
js 异步操作回调函数如何控制执行顺序
2013/12/24 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
window.open()实现post传递参数
2015/03/12 Javascript
Bootstrap每天必学之栅格系统(布局)
2015/11/25 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
2016/08/02 Javascript
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
2016/12/15 Javascript
微信小程序微信支付接入开发实例详解
2017/04/12 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
2017/07/19 jQuery
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
基于jstree使用AJAX请求获取数据形成树
2017/08/29 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
简单谈谈CommonsChunkPlugin抽取公共模块
2017/12/31 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
wxpython学习笔记(推荐查看)
2014/06/09 Python
深入解析Python中的变量和赋值运算符
2015/10/12 Python
python文件与目录操作实例详解
2016/02/22 Python
Python装饰器用法与知识点小结
2020/03/09 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
德国高性价比网上药店:medpex
2017/07/09 全球购物
如何写好建议书
2014/03/13 职场文书
三爱活动实施方案
2014/03/19 职场文书
市场营销策划方案
2014/06/11 职场文书
会议欢迎标语
2014/06/30 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
工作目标责任书
2014/07/23 职场文书
小学三好学生事迹材料
2014/08/15 职场文书
Win11 22H2 2022怎么更新? 获得Win1122H22022版本升级技巧
2022/09/23 数码科技