浅析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 相关文章推荐
JS location几个方法小姐
Jul 09 Javascript
js数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
May 15 Javascript
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
Apr 15 Javascript
JavaScript两种跨域技术全面介绍
Apr 16 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
Jun 06 Javascript
JS制作适用于手机和电脑的通知信息效果
Oct 28 Javascript
jQuery中Datatables增加跳转到指定页功能
Feb 08 Javascript
jQuery中.attr()和.data()的区别分析
Sep 03 jQuery
layui lay-verify form表单自定义验证规则详解
Sep 18 Javascript
原生js实现照片墙效果
Oct 13 Javascript
如何利用vue实现波谱拟合详解
Nov 05 Javascript
Vue3+elementui plus创建项目的方法
Dec 01 Vue.js
微信小程序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与C#的值类型指向区别的详解
2013/05/21 PHP
接收键盘指令的脚本
2006/06/26 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
jquery实现图片平滑滚动详解
2017/03/22 jQuery
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
[05:56]第十六期——新进3大C之小兔基
2014/06/24 DOTA
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
python动态参数用法实例分析
2015/05/25 Python
Python中列表和元组的相关语句和方法讲解
2015/08/20 Python
Python多线程实现同步的四种方式
2017/05/02 Python
Apache部署Django项目图文详解
2019/07/30 Python
Python logging设置和logger解析
2019/08/28 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
Django 批量插入数据的实现方法
2020/01/12 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
2020/05/15 Python
win10下python3.8的PIL库安装过程
2020/06/08 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
材料加工硕士生求职信
2013/10/10 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
优秀班组长事迹
2014/05/31 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
2014年租房协议书范本
2014/10/30 职场文书
2014年老干部工作总结
2014/11/21 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
Python pygame实现中国象棋单机版源码
2021/06/20 Python
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL