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 相关文章推荐
服务器安全设置的几个注册表设置
Jul 28 Javascript
Javascript string 扩展库代码
Apr 09 Javascript
Javascript this 的一些学习总结
Aug 31 Javascript
时间戳转换为时间 年月日时间的JS函数
Aug 19 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
Jun 23 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
Dec 14 Javascript
AngularJS $http模块POST请求实现
Apr 08 Javascript
AngularJS实现表单验证功能详解
Oct 12 Javascript
JavaScript中set与get方法用法示例
Aug 15 Javascript
JS如何获取地址栏的参数实例讲解
Oct 06 Javascript
js中的深浅拷贝问题简析
May 10 Javascript
layer.confirm()右边按钮实现href的例子
Sep 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 基于文件头的文件类型验证类函数
2012/05/01 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
jQuery.extend 函数的详细用法
2012/06/27 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
js编写选项卡效果
2017/05/23 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
详解浏览器缓存和webpack缓存配置
2018/07/06 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
vuex存取值和映射函数使用说明
2020/07/24 Javascript
通过实例解析JavaScript常用排序算法
2020/09/02 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
Python实现求笛卡尔乘积的方法
2017/09/16 Python
Python学习小技巧总结
2018/06/10 Python
使用Python微信库itchat获得好友和群组已撤回的消息
2018/06/24 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
String s = new String(“xyz”);创建了几个String Object?
2015/08/05 面试题
销售自我评价
2013/10/22 职场文书
葡萄牙语专业个人求职信
2013/12/10 职场文书
医院实习介绍信
2014/01/12 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
销售竞赛活动方案
2014/08/23 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python