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的tree组件
Dec 03 Vue.js
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 Vue.js
Vite和Vue CLI的优劣
Jan 30 Vue.js
vue实现拖拽进度条
Mar 01 Vue.js
VUE实现吸底按钮
Mar 04 Vue.js
vue3.0封装轮播图组件的步骤
Mar 04 Vue.js
vue组件的路由高亮问题解决方法
May 11 Vue.js
vue2实现provide inject传递响应式
May 21 Vue.js
一定要知道的 25 个 Vue 技巧
Nov 02 Vue.js
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 Vue.js
vue postcss-px2rem 自适应布局
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
Get或Post提交值的非法数据处理
2006/10/09 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
php上传图片存入数据库示例分享
2014/03/11 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
PHP设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
firefox firebug中文入门教程 脚本之家新年特别版
2010/01/02 Javascript
添加JavaScript重载函数的辅助方法2
2010/07/04 Javascript
JavaScript中清空数组的三种方法分享
2011/04/07 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
Nodejs进阶:基于express+multer的文件上传实例
2016/11/21 NodeJs
Vue.js学习之计算属性
2017/01/22 Javascript
angular中不同的组件间传值与通信的方法
2017/11/04 Javascript
JS中利用FileReader实现上传图片前本地预览功能
2018/03/02 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
[50:59]2018DOTA2亚洲邀请赛 4.7 总决赛 LGD vs Mineski第四场
2018/04/10 DOTA
详解使用pymysql在python中对mysql的增删改查操作(综合)
2017/01/18 Python
Pandas探索之高性能函数eval和query解析
2017/10/28 Python
对Python 网络设备巡检脚本的实例讲解
2018/04/22 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
python反扒机制的5种解决方法
2021/02/06 Python
移动端rem布局的两种实现方法
2018/01/03 HTML / CSS
美国网上订购鲜花:FTD
2016/09/23 全球购物
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
初三学习计划书范文
2014/04/30 职场文书
小学教师节活动总结
2015/03/20 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
SQL Server Agent 服务无法启动
2022/04/20 SQL Server
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
2022/05/04 Python