浅析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插件Style定制化方法的分析与比较
May 03 Javascript
如何使用Jquery获取Form表单中被选中的radio值
Aug 09 Javascript
解决jquery版本冲突的有效方法
Sep 02 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
Jan 04 Javascript
原生JS查找元素的方法(推荐)
Nov 22 Javascript
JS实现动画兼容性的transition和transform实例分析
Dec 13 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
Jul 18 Javascript
zTree异步加载展开第一级节点的实现方法
Sep 05 Javascript
浅谈一种让小程序支持JSX语法的新思路
Jun 16 Javascript
Node.js 实现远程桌面监控的方法步骤
Jul 02 Javascript
小程序实现短信登录倒计时
Jul 12 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
Jul 29 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下过滤HTML代码的函数
2007/12/10 PHP
PHP制作百度词典查词采集器
2015/01/29 PHP
CodeIgniter视图使用注意事项
2016/01/20 PHP
PHP中header函数的用法及其注意事项详解
2016/06/13 PHP
php简单实现多维数组排序的方法
2016/09/30 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
jquery使用append(content)方法注意事项分享
2014/01/06 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
JS控制HTML元素的显示和隐藏的两种方法
2016/09/27 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
详解vue中移动端自适应方案
2019/05/05 Javascript
vue如何截取字符串
2019/05/06 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
微信小程序工具函数封装
2019/10/28 Javascript
Python数据结构与算法之图结构(Graph)实例分析
2017/09/05 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
python列表,字典,元组简单用法示例
2019/07/11 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
《一个小村庄的故事》教学反思
2014/04/13 职场文书
吴仁宝观后感
2015/06/09 职场文书
心理学培训心得体会
2016/01/22 职场文书
导游词之珠海轮廓
2019/10/25 职场文书
SQLServer之常用函数总结详解
2021/08/30 SQL Server
python编程简单几行代码实现视频转换Gif示例
2021/10/05 Python