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 While 循环基础教程
Apr 05 Javascript
javascript 一个自定义长度的文本自动换行的函数
Aug 19 Javascript
50款非常棒的 jQuery 插件分享
Mar 29 Javascript
中国地区三级联动下拉菜单效果分析
Nov 15 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
Apr 07 Javascript
jquery封装的对话框简单实现
Jul 21 Javascript
javascript中全局对象的isNaN()方法使用介绍
Dec 19 Javascript
JQuery实现简单的服务器轮询效果实例
Mar 31 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
Jan 15 Javascript
使用classList来实现两个按钮样式的切换方法
Jan 24 Javascript
vue中子组件的methods中获取到props中的值方法
Aug 27 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
Jul 28 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 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
php递归遍历删除文件的方法
2015/04/17 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
用js计算页面执行时间的函数
2006/12/07 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
2016/06/13 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
微信小程序商城项目之购物数量加减(3)
2017/04/17 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
webpack4+react多页面架构的实现
2018/10/25 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
Python实现定时任务
2017/02/08 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
wxPython之解决闪烁的问题
2018/01/15 Python
python中requests和https使用简单示例
2018/01/18 Python
python实现二叉查找树实例代码
2018/02/08 Python
python3编写ThinkPHP命令执行Getshell的方法
2019/02/26 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
Python常见反爬虫机制解决方案
2020/06/01 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
什么是View State?
2013/01/27 面试题
音乐教师个人工作总结
2015/02/06 职场文书
2015年文员个人工作总结
2015/04/09 职场文书
保留意见审计报告
2015/06/05 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
KVM基础命令详解
2022/04/30 Servers
springboot集成redis存对象乱码的问题及解决
2022/06/16 Java/Android
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers