浅析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扩展插件Validate 5添加自定义验证方法
Sep 05 Javascript
引用外部js乱码问题分析及解决方案
Apr 12 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
Apr 27 Javascript
JS代码同步文本框内容的实例方法
Jul 12 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
Apr 07 Javascript
AspNet中使用JQuery上传插件Uploadify详解
May 20 Javascript
jQuery简单实现仿京东分类导航层效果
Jun 07 Javascript
js Canvas实现圆形时钟教程
Sep 19 Javascript
jQuery查找dom的几种方法效率详解
May 17 jQuery
深入理解Commonjs规范及Node模块实现
May 17 Javascript
bootstrap table使用入门基本用法
May 24 Javascript
JS+canvas五子棋人机对战实现步骤详解
Jun 04 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
做个自己站内搜索引擎
2006/10/09 PHP
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
php利用cookie实现访问次数统计代码
2011/05/19 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
2019/10/12 PHP
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
jQuery使用手册之一
2007/03/24 Javascript
JavaScript之引用类型介绍
2012/08/10 Javascript
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
JavaScript生成GUID的多种算法小结
2013/08/18 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
javascript实现信息增删改查的方法
2015/07/25 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
简单介绍Python中的len()函数的使用
2015/04/07 Python
Python的包管理器pip更换软件源的方法详解
2016/06/20 Python
python 把数据 json格式输出的实例代码
2016/10/31 Python
python正则中最短匹配实现代码
2018/01/16 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
python设置环境变量的作用和实例
2019/07/09 Python
Python接口测试get请求过程详解
2020/02/28 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
应届生服务员求职信
2013/10/31 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
说明书范文
2014/05/07 职场文书
重点工程汇报材料
2014/08/27 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
小人国观后感
2015/06/11 职场文书