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 入门基础知识 想学习js的朋友可以参考下
Dec 26 Javascript
鼠标滑上去后图片放大浮出效果的js代码
May 28 Javascript
JQuery设置和去除disabled属性的5种方法总结
May 16 Javascript
js opener的使用详解
Jan 11 Javascript
基于jquery和svg实现超炫酷的动画特效
Dec 09 Javascript
详解Angular2 之 结构型指令
Jun 21 Javascript
JavaScript实现计数器基础方法
Oct 10 Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
Aug 04 Javascript
js防抖和节流的深入讲解
Dec 06 Javascript
ES6 如何改变JS内置行为的代理与反射
Feb 11 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
Feb 13 Javascript
解决Can't find variable: SockJS vue项目的问题
Sep 22 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
农民C键的运用技巧
2020/03/04 星际争霸
php学习之 认清变量的作用范围
2010/01/26 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
10个对初学者非常有用的PHP技巧
2016/04/06 PHP
Jquery中ajax方法data参数的用法小结
2014/02/12 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
JavaScript引用类型Array实例分析
2018/07/24 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
2019/04/30 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
老生常谈进程线程协程那些事儿
2017/07/24 Python
人工智能最火编程语言 Python大战Java!
2017/11/13 Python
Python使用django框架实现多人在线匿名聊天的小程序
2017/11/29 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
Python使用Pandas库常见操作详解
2020/01/16 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
HTML5中的autofocus(自动聚焦)属性介绍
2014/04/23 HTML / CSS
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
办公室前台的岗位职责
2013/12/20 职场文书
规划编制实施方案
2014/03/15 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
mysql5.7使用binlog 恢复数据的方法
2021/06/03 MySQL
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android