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中音频wavesurfer.js的使用方法
Feb 20 Vue.js
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
vue 动态生成拓扑图的示例
Jan 03 Vue.js
浅谈Vue开发人员的7个最好的VSCode扩展
Jan 20 Vue.js
vue使用transition组件动画效果的实例代码
Jan 28 Vue.js
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 Vue.js
vue使用节流函数的踩坑实例指南
May 20 Vue.js
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 Vue.js
vue实力踩坑之push当前页无效
Apr 10 Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 Vue.js
vue组件vue-esign实现电子签名
Apr 21 Vue.js
Vue ECharts实现机舱座位选择展示功能
May 15 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
一个查看session内容的函数
2006/10/09 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
6个超实用的PHP代码片段
2015/08/10 PHP
js实现带搜索功能的下拉框实时搜索实时匹配
2013/11/05 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
深入浅析search 搜索框的写法
2016/08/02 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
解决vue-router中的query动态传参问题
2018/03/20 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
JavaScript实现电灯开关小案例
2020/03/30 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
Hadoop中的Python框架的使用指南
2015/04/22 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
简单了解python PEP的一些知识
2019/07/13 Python
python 列表推导式使用详解
2019/08/29 Python
Python实现计算长方形面积(带参数函数demo)
2020/01/18 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
2020/01/21 Python
三只松鼠官方旗舰店:全网坚果销售第1
2017/11/25 全球购物
机械设计及其自动化专业推荐信
2013/10/31 职场文书
社区学习十八大感想
2014/01/22 职场文书
企业法人授权委托书
2014/04/03 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
学生评语集锦
2015/01/04 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers
JVM钩子函数的使用场景详解
2021/08/23 Java/Android
MYSQL如何查看进程和kill进程
2022/03/13 MySQL
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电