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 相关文章推荐
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
Aug 28 Javascript
Jquery节点遍历next与nextAll方法使用示例
Jul 22 Javascript
JavaScript常用脚本汇总(一)
Mar 04 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
Mar 10 Javascript
再谈javascript注入 黑客必备!
Sep 14 Javascript
浅谈使用React.setState需要注意的三点
Dec 18 Javascript
详解vue-meta如何让你更优雅的管理头部标签
Jan 18 Javascript
vue中tab选项卡的实现思路
Nov 25 Javascript
Angular请求防抖处理第一次请求失效问题
May 17 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
Sep 10 Javascript
javascript实现电商放大镜效果
Nov 23 Javascript
详解vue中v-for的key唯一性
May 15 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
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
javascript操作文本框readOnly
2007/05/15 Javascript
JQquery的一些使用心得分享
2012/08/01 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
2013/01/11 Javascript
DIV+CSS+JS不间断横向滚动实现代码
2013/03/19 Javascript
jQuery实现动画效果的实例代码
2013/05/07 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
jquery制作 随机弹跳的小球特效
2015/02/01 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
javascript self对象使用详解
2016/10/18 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
微信小程序控制台提示warning:Now you can provide attr &quot;wx:key&quot; for a &quot;wx:for&quot; to improve performance解决方法
2019/02/21 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
2019/06/10 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
基于JS实现计算24点算法代码实例解析
2020/07/23 Javascript
介绍Python中内置的itertools模块
2015/04/29 Python
用Python编写web API的教程
2015/04/30 Python
Python 实现字符串中指定位置插入一个字符
2018/05/02 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
HTML5之WebGL 3D概述(下)—借助类库开发及框架介绍
2013/01/31 HTML / CSS
个人简历的自荐信
2013/10/23 职场文书
高三体育教学反思
2014/01/29 职场文书
工程师岗位职责规定
2014/02/26 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
肖申克救赎观后感
2015/06/02 职场文书
平凡的世界读书笔记
2015/06/25 职场文书
vue-router中hash模式与history模式的区别
2021/06/23 Vue.js
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js
win10系统xps文件怎么打开?win10打开xps文件的两种操作方法
2022/07/23 数码科技
基于redis+lua进行限流的方法
2022/07/23 Redis