浅析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 相关文章推荐
Display SQL Server Login Mode
Jun 21 Javascript
Javascript 读书笔记索引贴
Jan 11 Javascript
jquery跟js初始化加载的多种方法及区别介绍
Apr 02 Javascript
JavaScript中的typeof操作符用法实例
Apr 05 Javascript
get(0).tagName获得作用标签示例代码
Oct 08 Javascript
JS取得绝对路径的实现代码
Jan 16 Javascript
jQuery点缩略图弹出层显示大图片
Feb 13 Javascript
js实现选中页面文字将其分享到新浪微博
Nov 05 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
Dec 26 Javascript
React根据宽度自适应高度的示例代码
Oct 11 Javascript
Bootstrap table表格初始化表格数据的方法
Jul 25 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
Apr 20 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
模拟flock实现文件锁定
2007/02/14 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
PHP针对字符串开头和结尾的判断方法
2016/07/11 PHP
php版微信公众平台开发之验证步骤实例详解
2016/09/23 PHP
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
javascript 网页跳转的方法
2008/12/24 Javascript
Jquery Change与bind事件代码
2011/09/29 Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
JavaScript生成GUID的多种算法小结
2013/08/18 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
jQuery中$.ajax()方法参数解析
2016/10/22 Javascript
ReactJs快速入门教程(精华版)
2016/11/28 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
js实现简易ATM功能
2020/10/27 Javascript
Python中functools模块的常用函数解析
2016/06/30 Python
Python实现Smtplib发送带有各种附件的邮件实例
2017/06/05 Python
Python编程之序列操作实例详解
2017/07/22 Python
PyQt5每天必学之关闭窗口
2018/04/19 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
如何Tkinter模块编写Python图形界面
2020/10/14 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
项目开发计划书
2014/01/09 职场文书
义务教育学校标准化建设汇报材料
2014/08/16 职场文书
小学运动会演讲稿
2014/08/25 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
家长对孩子的寒假评语
2015/10/09 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
初中数学教学反思范文
2016/02/17 职场文书
css3实现背景图片颜色修改的多种方式
2021/04/13 HTML / CSS