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+element_ui上传文件,并传递额外参数操作
Dec 05 Vue.js
vue3使用vue-count-to组件的实现
Dec 25 Vue.js
vue 使用rules对表单字段进行校验的步骤
Dec 25 Vue.js
vue element和nuxt的使用技巧分享
Jan 14 Vue.js
如何在vue中使用HTML 5 拖放API
Jan 14 Vue.js
基于vue的video播放器的实现示例
Feb 19 Vue.js
vue项目实现分页效果
Mar 24 Vue.js
vue3如何优雅的实现移动端登录注册模块
Mar 29 Vue.js
vue3使用vuedraggable实现拖拽功能
Apr 06 Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 Vue.js
vue实现在data里引入相对路径
Jun 05 Vue.js
Vue 打包后相对路径的引用问题
Jun 05 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 header函数分析详解
2011/08/06 PHP
PHP解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
PHP正则表达式匹配替换与分割功能实例浅析
2017/02/04 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
js相册效果代码(点击创建即可)
2013/04/16 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
javascript面向对象之定义成员方法实例分析
2015/01/13 Javascript
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
深入学习jQuery中的data()
2016/12/22 Javascript
详解Webpack + ES6 最新环境搭建与配置
2018/06/04 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
详解Vue.directive 自定义指令
2019/03/27 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
python生成器的使用方法
2013/11/21 Python
python 第三方库的安装及pip的使用详解
2017/05/11 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
2018/02/07 Python
python Django编写接口并用Jmeter测试的方法
2019/07/31 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
2021/01/07 Python
Python脚本调试工具安装过程
2021/01/11 Python
电子信息专业学生自荐信
2013/11/09 职场文书
银行行长竞聘演讲稿
2014/04/23 职场文书
商业街策划方案
2014/05/31 职场文书
工人先进事迹材料
2014/12/26 职场文书
建国大业观后感600字
2015/06/01 职场文书
简单聊一聊SQL注入及防止SQL注入
2022/03/23 MySQL
python实现简单的三子棋游戏
2022/04/28 Python
一文搞懂Java中的注解和反射
2022/06/21 Java/Android