浅析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 可以拖动的div实现代码 脚本之家修正版
Jun 26 Javascript
浏览器打开层自动缓慢展开收缩实例代码
Jul 04 Javascript
JS 操作Array数组的方法及属性实例解析
Jan 08 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
Nov 03 Javascript
javascript实现自动填写表单实例简析
Dec 02 Javascript
[js高手之路]单例模式实现模态框的示例
Sep 01 Javascript
three.js实现3D视野缩放效果
Nov 16 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
Dec 10 Javascript
js变量值传到php过程详解 将php解析成数据
Jun 26 Javascript
Vue学习之常用指令实例详解
Jan 06 Javascript
微信小程序canvas截取任意形状的实现代码
Jan 13 Javascript
浅谈vant组件Picker 选择器选单选问题
Nov 04 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代码DOS造成用光网络带宽
2011/03/01 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
php截取视频指定帧为图片
2016/05/16 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
document.getElementById介绍
2011/09/13 Javascript
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
2020/09/12 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
Javascript基础之数组的使用
2016/05/13 Javascript
微信小程序 教程之注册页面
2016/10/17 Javascript
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
2017/11/22 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
2018/01/07 Javascript
Mac下通过brew安装指定版本的nodejs教程
2018/05/17 NodeJs
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
2020/05/26 Javascript
在Python中使用元类的教程
2015/04/28 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
Python处理菜单消息操作示例【基于win32ui模块】
2018/05/09 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
python多任务之协程的使用详解
2019/08/26 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
Prototype如何更新局部页面
2013/03/03 面试题
小摄影师教学反思
2014/04/27 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
经典毕业生求职信
2014/07/12 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
捐书活动倡议书
2015/04/27 职场文书
驳回起诉裁定书
2015/05/19 职场文书
初中团委工作总结
2015/08/13 职场文书