浅析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 相关文章推荐
ExtJS 2.0实用简明教程之应用ExtJS
Apr 29 Javascript
js截取小数点后几位的写法
Nov 14 Javascript
JavaScript包装对象使用详解
Jul 09 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
Aug 25 Javascript
layui点击导航栏刷新tab页的示例代码
Aug 14 Javascript
详解webpack模块加载器兼打包工具
Sep 11 Javascript
elementUI 设置input的只读或禁用的方法
Oct 30 Javascript
JavaScript实现与使用发布/订阅模式详解
Jan 19 Javascript
vue+element实现打印页面功能
May 20 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
Jun 11 Javascript
前端开发基础javaScript的六大作用
Aug 06 Javascript
ant design vue导航菜单与路由配置操作
Oct 28 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
yii框架源码分析之创建controller代码
2011/06/28 PHP
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
理解JavaScript的caller,callee,call,apply
2009/04/28 Javascript
jQuery1.6 使用方法二
2011/11/23 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
2014/03/28 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
Vue-router路由判断页面未登录跳转到登录页面的实例
2017/10/26 Javascript
通过一个简单的例子学会vuex与模块化
2017/11/22 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
浅谈AngularJS中$http服务的简单用法
2018/05/15 Javascript
详解vue中移动端自适应方案
2019/05/05 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
vue项目中微信登录的实现操作
2020/09/08 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
python中sleep函数用法实例分析
2015/04/29 Python
Python脚本处理空格的方法
2016/08/08 Python
关于反爬虫的一些简单总结
2017/12/13 Python
python3+PyQt5实现柱状图
2018/04/24 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
python线程的几种创建方式详解
2019/08/29 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
基于python连接oracle导并出数据文件
2020/04/28 Python
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
文员个人的求职信范文
2013/09/26 职场文书
汽车销售顾问求职自荐信
2014/01/01 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
教师节主题班会方案
2015/08/17 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript