浅析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代码格式化和语法着色V2
Oct 14 Javascript
写出更好的JavaScript之undefined篇(上)
Nov 22 Javascript
jquery获取div宽度的实现思路与代码
Jan 13 Javascript
jQuery中nextUntil()方法用法实例
Jan 07 Javascript
JavaScript代码判断点击第几个按钮
Dec 13 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
Apr 05 Javascript
Vue.js中数据绑定的语法教程
Jun 02 Javascript
深入理解Angular中的依赖注入
Jun 26 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
Jan 23 jQuery
vue实现局部刷新的实现示例
Apr 16 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
Jul 31 Javascript
vue-cli4.x创建企业级项目的方法步骤
Jun 18 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 翻页 实例代码
2009/08/07 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
PHP遍历数组的方法汇总
2015/04/30 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
PHP使用PDO操作sqlite数据库应用案例
2019/03/07 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
使用PHP开发留言板功能
2019/11/19 PHP
TNC vs RR BO3 第一场 2.14
2021/03/10 DOTA
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
2014/06/26 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
2015/12/13 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
Python ljust rjust center输出
2008/09/06 Python
Python随机生成数模块random使用实例
2015/04/13 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
Java编程面试题
2016/04/04 面试题
2014年庆元旦活动方案
2014/02/15 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2014年店长工作总结
2014/11/17 职场文书
2015年学校禁毒工作总结
2015/05/27 职场文书
出生证明格式
2015/06/15 职场文书
创业计划书之香辣虾火锅
2019/09/23 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书
python 逐步回归算法
2021/04/06 Python