浅析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 相关文章推荐
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
Sep 21 Javascript
node.js中的fs.realpath方法使用说明
Dec 16 Javascript
JS未跨域操作iframe里的DOM
Jun 01 Javascript
javascript特殊文本输入框网页特效
Sep 13 Javascript
javascript读取文本节点方法小结
Dec 15 Javascript
微信小程序 实战实例开发流程详细介绍
Jan 05 Javascript
使用Promise链式调用解决多个异步回调的问题
Jan 15 Javascript
浅谈sass在vue注意的地方
Aug 10 Javascript
JavaScript中EventLoop介绍
Jan 22 Javascript
Vue瀑布流插件的使用示例
Sep 19 Javascript
vue代码分割的实现(codesplit)
Nov 13 Javascript
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
Mar 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
文件上传的实现
2006/10/09 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
js 中的switch表达式使用示例
2020/06/03 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
BootStrap响应式导航条实例介绍
2016/05/06 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
2016/05/25 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
2018/10/18 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
[05:08]顺网杯ISS-DOTA2赛歌 少女偶像Lunar青春演绎
2013/12/05 DOTA
python Django模板的使用方法(图文)
2013/11/04 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
python内存监控工具memory_profiler和guppy的用法详解
2019/07/29 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
2021/03/03 Python
港湾网络笔试题
2014/04/19 面试题
个人自我评价范文
2014/02/05 职场文书
设计专业自荐信
2014/06/19 职场文书
2014年社团工作总结范文
2014/11/27 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书
利用Python网络爬虫爬取各大音乐评论的代码
2021/04/13 Python
mysql外连接与内连接查询的不同之处
2021/06/03 MySQL
Java 将PPT幻灯片转为HTML文件的实现思路
2021/06/11 Java/Android