浅析Vue 防抖与节流的使用


Posted in Javascript onNovember 14, 2019

在一个电影项目中,我想在电影的列表中,保存下拉的当前位置,防止你切换页面后,再切换回当前的电影列表页,他就又回到电影的第一条数据。

这时候,我不想每次只要滑动一点,就保存当前位置,我想隔一段时间,保存一次,这时候,就可以使用防抖和节流。

概念

说白了, 防抖节流就是使用定时器 来实现我们的目的。

防抖(debounce):

在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。

典型的案例就是输入框搜索:输入结束后n秒才进行搜索请求,n秒内又输入的内容,则重新计时。

节流(throttle):

规定在一个单位时间内,只能触发一次函数,如果这个单位时间内触发多次函数,只有一次生效。

典型的案例就是鼠标不断点击触发,规定在n秒内多次点击只生效一次。

用法

防抖(debounce)

下拉列表,隔一段时间保存当前下拉位置。

我们可以在 mounted 钩子中实现我们的防抖:

// 防抖 定时器
let timer;
//list就是电影列表 ref="list" $el获取DOM元素
this.$refs.list.$el.addEventListener("scroll", e => {
 console.log("---->",e.target.scrollTop) //不使用防抖
 if (timer) {
 //清空timer
 clearTimeout(timer);
 }
 timer = setTimeout(() => {
 console.log(e.target.scrollTop) //使用防抖
 
 //在sessionStorage中保存当前下拉位置
 // sessionStorage.setItem("position", e.target.scrollTop);
 }, 75); //75mm为最佳
});

效果演示(隔一段时间保存当前位置):

加 ----> 为不使用防抖,没加的则使用防抖

输入框搜索隔段时间进行搜索请求:

<template>
 <div>
  <input type="text" @keyup="debounce" />
 </div>
</template>

<script>
//定义 timer
let timer;
export default {
 methods: {
  debounce: function() {
   if (timer) {
    clearTimeout(timer);
   }
   timer = setTimeout(() => {
    console.log("防抖...");
    timer = undefined;
   }, 2000);
  }
 }
};
</script>

浅析Vue 防抖与节流的使用 

节流(throttle)

在n秒内点击多次,只有一次生效。

<template>
 <div>
  <button @click="throttle">按钮</button>
 </div>
</template>

<script>
//定义
let timer, lastTime;
export default {
 methods: {
  throttle: function() {
   let now = +new Date();
   if (lastTime && lastTime - now < 200) { //在200ms内点击多次,只有一次生效
    clearTimeout(timer);
   }
   timer = setTimeout(() => {
    console.log("点击...");
    lastTime = +new Date();
   }, 200);
  }
 }
};
</script>

效果演示:

浅析Vue 防抖与节流的使用 

补充

当然,也可以对这两个方法进行封装,以便在多处使用。

/**
 * 函数防抖 (只执行最后一次点击)
 */
export const Debounce = (fn, t) => {
  let delay = t || 500;
  let timer;
  console.log(fn)
  console.log(typeof fn)
  return function () {
    let args = arguments;
    if(timer){
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      timer = null;
      fn.apply(this, args);
    }, delay);
  }
};
/*
 * 函数节流
 */
export const Throttle = (fn, t) => {
  let last;
  let timer;
  let interval = t || 500;
  return function () {
    let args = arguments;
    let now = +new Date();
    if (last && now - last < interval) {
      clearTimeout(timer);
      timer = setTimeout(() => {
        last = now;
        fn.apply(this, args);
      }, interval);
    } else {
      last = now;
      fn.apply(this, args);
    }
  }
};

总结

以上所述是小编给大家介绍的Vue 防抖与节流的使用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
Jun 27 Javascript
js获取url中&quot;?&quot;后面的字串方法
May 15 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
Jan 02 Javascript
jQuery中:disabled选择器用法实例
Jan 04 Javascript
JavaScript实现给定时间相加天数的方法
Jan 25 Javascript
JavaScript面试开发常用的知识点总结
Aug 08 Javascript
浅析Javascript ES6中的原生Promise
Aug 25 Javascript
Node.js connect ECONNREFUSED错误解决办法
Sep 15 Javascript
微信js-sdk上传与下载图片接口用法示例
Oct 12 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
Jan 05 Javascript
vue自定义指令用法经典实例小结
Mar 16 Javascript
js+canvas实现转盘效果(两个版本)
Sep 13 Javascript
微信小程序tabBar设置实例解析
Nov 14 #Javascript
layui清除radio的选中状态实例
Nov 14 #Javascript
在vue中利用v-html按分号将文本换行的例子
Nov 14 #Javascript
搭建Vue从Vue-cli到router路由护卫的实现
Nov 14 #Javascript
关于vue.js中实现方法内某些代码延时执行
Nov 14 #Javascript
用Node写一条配置环境的指令
Nov 14 #Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
Nov 14 #Javascript
You might like
PHP中Fatal error session_start()错误解决步骤
2014/08/05 PHP
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
PHP中preg_match函数正则匹配的字符串长度问题
2015/05/27 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
2017/01/19 PHP
JS 用6N±1法求素数 实例教程
2009/10/20 Javascript
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
JavaScript操作class和style样式代码详解
2016/02/13 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
详解angularjs跨页面传参遇到的一些问题
2018/11/01 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
2020/12/17 Vue.js
Python生成随机密码
2015/03/10 Python
详解Python中with语句的用法
2015/04/15 Python
详解使用Python处理文件目录的相关方法
2015/10/16 Python
python XlsxWriter模块创建aexcel表格的实例讲解
2018/05/03 Python
使用python获取(宜宾市地震信息)地震信息
2019/06/20 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
详解KMP算法以及python如何实现
2020/09/18 Python
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
为什么要用EJB
2014/04/17 面试题
推荐信模板
2014/05/09 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
受资助学生感谢信
2015/01/21 职场文书
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技