Vue2.x-使用防抖以及节流的示例


Posted in Vue.js onMarch 02, 2021

utils:

// 防抖
export const debounce = (func, wait = 3000, immediate = true) => {
 let timeout = null;
 return function() {
  let context = this;
  let args = arguments;
  if (timeout) clearTimeout(timeout);
  if (immediate) {
   var callNow = !timeout; //点击第一次为true 时间内点击第二次为false 时间结束则重复第一次
   timeout = setTimeout(() => {
    timeout = null;
   }, wait); //定时器ID
   if (callNow) func.apply(context, args);
  } else {
   timeout = setTimeout(function() {
    func.apply(context, args);
   }, wait);
  }
 };
};
// 时间戳方案
export const throttleTime = (fn, wait = 2000) => {
 var pre = Date.now();
 return function() {
  var context = this;
  var args = arguments;
  var now = Date.now();
  if (now - pre >= wait) {
   fn.apply(context, args);
   pre = Date.now();
  }
 };
};
// 定时器方案
export const throttleSetTimeout = (fn, wait = 3000) => {
 var timer = null;
 return function() {
  var context = this;
  var args = arguments;
  if (!timer) {
   timer = setTimeout(function() {
    fn.apply(context, args);
    timer = null;
   }, wait);
  }
 };
};

vue中使用:

<template>
 <div class="main">
  <p>防抖立即执行</p>
  <button @click="click1">点击</button>

  <br />

  <p>防抖不立即执行</p>
  <button @click="click2">点击</button>

  <br />

  <p>节流时间戳方案</p>
  <button @click="click3">点击</button>

  <br />

  <p>节流定时器方案</p>
  <button @click="click4">点击</button>
 </div>
</template>

<script>
import { debounce, throttleTime, throttleSetTimeout } from './utils';
export default {
 methods: {
  click1: debounce(
   function() {
    console.log('防抖立即执行');
   },
   2000,
   true
  ),
  click2: debounce(
   function() {
    console.log('防抖不立即执行');
   },
   2000,
   false
  ),
  click3: throttleTime(function() {
   console.log('节流时间戳方案');
  }),
  click4: throttleSetTimeout(function() {
   console.log('节流定时器方案');
  })
 },
};
</script>

<style scoped lang="scss">
* {
 margin: 0;
 font-size: 20px;
 user-select: none;
}
.main {
 position: absolute;
 left: 50%;
 transform: translateX(-50%);
 width: 500px;
}
button {
 margin-bottom: 100px;
}
</style>

解释:

防抖:

立即执行版本:immediate为true,则点击第一次就执行,再继续点击则不执行,当wait时间结束后,再点击则生效,也就是只执行第一次。

原理:

点击第一次不存在timeoutID,并且callNow为true,则立即执行目标代码,点击第二次时存在了timeoutID,并且callNow为false,所以不执行目标代码,当wait时间结束后,把timeoutID设为null,则开始重复立即执行逻辑。

不立即执行版:immediate为false,则点击第一次不执行,当wait时间结束后,才生效,也就是无论点击多少次,只执行最后一次点击事件

原理:

使用setTimeout延迟执行事件,如果多次触发,则clearTimeout上次执行的代码,重新开始计时,在计时期间没有触发事件,则执行目标代码。

节流:

连续触发事件时以wait频率执行目标代码。

效果:

Vue2.x-使用防抖以及节流的示例

以上就是Vue2.x-使用防抖以及节流的示例的详细内容,更多关于vue 防抖及节流的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
Vue实现购物小球抛物线的方法实例
Nov 22 Vue.js
Vue如何跨组件传递Slot的实现
Dec 14 Vue.js
vue实现简易计算器功能
Jan 20 Vue.js
vue 数据双向绑定的实现方法
Mar 04 Vue.js
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
关于vue中如何监听数组变化
Apr 28 Vue.js
vue实现无缝轮播效果(跑马灯)
May 14 Vue.js
深入讲解Vue中父子组件通信与事件触发
Mar 22 Vue.js
Vue3中toRef与toRefs的区别
Mar 24 Vue.js
vue选项卡切换的实现案例
Apr 11 Vue.js
vue特效之翻牌动画
Apr 20 Vue.js
Vue操作Storage本地化存储
Apr 29 Vue.js
Vue中避免滥用this去读取data中数据
Mar 02 #Vue.js
vue脚手架项目创建步骤详解
Mar 02 #Vue.js
vue-cli中实现响应式布局的方法
Mar 02 #Vue.js
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
Mar 01 #Vue.js
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 #Vue.js
vue实现拖拽进度条
Mar 01 #Vue.js
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 #Vue.js
You might like
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
php查询相似度最高的字符串的方法
2015/03/12 PHP
PHP浮点数精度问题汇总
2015/05/13 PHP
PHP微信开发之文本自动回复
2016/06/23 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
jQuery插件-jRating评分插件源码分析及使用方法
2012/12/28 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
js获取视频时长代码
2014/04/10 Javascript
禁用Tab键JS代码兼容Firefox和IE
2014/04/18 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
javascript实现复选框选中属性
2015/03/25 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
[01:07:11]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
35个Python编程小技巧
2014/04/01 Python
pygame学习笔记(5):游戏精灵
2015/04/15 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
2018/06/27 Python
python列表list保留顺序去重的实例
2018/12/14 Python
Python for循环与range函数的使用详解
2019/03/23 Python
django之自定义软删除Model的方法
2019/08/14 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
python实现的发邮件功能示例
2019/09/11 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
辣妈辣妹观后感
2015/06/10 职场文书