之前有试过几种都没有其效果 原因:

1.vue写法与普通有点差异,因为vue的this不仅仅是当前的组件对象,还往上继承了vue对象(下文可以看出差异)
2.call ,apply都只能继承父级,并不能深度继承
3.因为深度继承需要递归或者多层嵌套函数,代码量大且难维护,因此推荐下方方法

1.防暴点(preventReClick)

问题:快速点击按钮时会频繁重复调用接口,为了防止这种情况,要对相应的按钮进行防暴力重复点击处理,最好是使用函数防抖或者函数截流来处理,但是现在已经要修改的按钮太多了,于是换一种方法,用指令的方式来达到相识的效果。

1.创建utils文件夹,在该文件夹下创建preventReClick.js文件

import Vue from 'vue'
// 在vue上挂载一个指量 preventReClick
const preventReClick = Vue.directive('preventReClick', {inserted: function (el, binding) {console.log(el.disabled)el.addEventListener('click', () => {if (!el.disabled) {el.disabled = truesetTimeout(() => {el.disabled = false}, binding.value || 3000)//binding.value可以自行设置。如果设置了则跟着设置的时间走//例如:v-preventReClick='500'}})}
});
export { preventReClick }

2.在main.js中全局引用

import './utils/preventReClick.js'

3.在button组件中直接使用 v-preventReClick 指令

 <a-button type="primary" @click="handleSubmit" v-preventReClick >保存</a-button>

1.防抖(debounce)

含义:
用户停下操作,就执行函数;只要不停止操作,永远不会执行函数内的操作

使用场景:防抖常应用于用户进行搜索输入节约请求资源
如:原来watch用户输入值改变马上请求接口 ,加入防抖,停止输入操作才会对接口进行访问
代码:

/*** @description 函数防抖 触发高频时间后n秒内函数只会执行一次,如果n秒内高频时间再次触发,则重新计算时间。* @param {Function} func 需要执行的函数* @param {Number} wait 间隔时间 默认200ms* @param {Boolean} immediate  是否立即执行 true(默认) 表立即执行,false 表非立即执行* @return {*}* @author liuxin*/
export function VueDebounce(func, wait = 200, immediate = true) {let timeout = null;  // 定时器return function () {let that = this, // this对象args = arguments; // 参数if (timeout) clearTimeout(timeout);if (immediate === true) { // 立即执行var callNow = !timeout;timeout = setTimeout(() => {timeout = null;}, wait)if (callNow) {// func.apply(that, args); // 普通用法that[func](...args); // vue用法}}else { // 非立即执行timeout = setTimeout(() => {// func.apply(this, args); // 普通用法that[func](...args); // vue用法}, wait);}}
}

用法:

methods: {/*** 点击事件 函数防抖* 用法:<el-button @click="debounceHandel">点击测试</el-button>*/debounceHandel: VueDebounce("handlerFunc"),/*** 点击事件:真正执行的函数*/handlerFunc(type) {console.log("测试防抖事件");this.$emit("click","这是参数"); // 如果用普通用法,则这里会找不到$emit,因为this还往上继承了vue的对象},}

2.节流(throttle)

含义:高频时间触发,但n秒内只会执行一次,所以节流会稀释函数的执行频率。。是个固定的过程 ,如限制1s,则1s内只执行一次,无论怎样,都在会1s内执行相应的操作
使用场景:和防抖使用场景差不多,关键看固定时间内(1s)需要反馈,需要反馈使用节流,即:无论用户是否停下操作,都会固定时间执行函数操作
代码:用法与函数防抖一致
/**

 * @description 函数节流* @param {Function} func 函数* @param {Number} wait 延迟执行毫秒数,默认200* @param {Number} type 1 表时间戳版,2 表定时器版*/
function VueThrottle(func, wait=200 ,type) {if(type===1){let previous = 0;}else if(type===2){let timeout;}return function() {let that= this;let args = arguments;if(type===1){let now = Date.now();if (now - previous > wait) {// func.apply(that, args); // 普通用法that[func](...args); // vue用法previous = now;}}else if(type===2){if (!timeout) {timeout = setTimeout(() => {timeout = null;// func.apply(that, args)that[func](...args); // vue用法}, wait)}}}
}

部分原文

loadsh插件防抖和节流

安装lodash插件,该插件提供了防抖和节流的函数,我们可以引入js文件,直接调用。当然也可以自己写防抖和节流的函数
lodash官网
防抖:用户操作很频繁,但是只执行一次,减少业务负担。
节流:用户操作很频繁,但是把频繁的操作变为少量的操作,使浏览器有充分时间解析代码
防抖和节流简述
例如:下面代码就是将changeIndex设置了节流,如果操作很频繁,限制50ms执行一次。这里函数定义采用的键值对形式。throttle的返回值就是一个函数,所以直接键值对赋值就可以,函数的参数在function中传入即可。

import {throttle} from 'lodash'methods: {//鼠标进入修改响应元素的背景颜色//采用键值对形式创建函数,将changeIndex定义为节流函数,该函数触发很频繁时,设置50ms才会执行一次changeIndex: throttle(function (index){this.currentIndex = index},50),//鼠标移除触发时间leaveIndex(){this.currentIndex = -1}}

Vue 编写(preventReClick)防暴点 +防抖(debounce)和节流(throttle)函数相关推荐

  1. 防抖debounce和节流throttle

    大纲 一.出现缘由 二.什么是防抖debounce和节流throttle 三.应用场景 3.1防抖 3.2节流 一.出现缘由 前端开发中,有一部分用户行为会频繁触发事件,而对于DOM操作,资源加载等耗 ...

  2. 函数防抖(debounce)和节流(throttle)在H5编辑器项目中的应用

    函数防抖(debounce)和节流(throttle)在H5编辑器项目中的应用 文章目录 函数防抖(debounce)和节流(throttle)在H5编辑器项目中的应用 1. 为什么要防抖节流 1.1 ...

  3. 函数防抖(debounce)和节流(throttle)以及lodash的debounce源码赏析

    函数节流和去抖的出现场景,一般都伴随着客户端 DOM 的事件监听.比如scroll resize等事件,这些事件在某些场景触发非常频繁. 比如,实现一个原生的拖拽功能(不能用 H5 Drag& ...

  4. 手写防抖(debounce)和节流(throttle)

    目录 测试代码 防抖(debounce) 基本功能实现 添加参数及this指向功能 第一次立即执行功能 取消功能 节流(throttle) 基本功能实现 增加this执向 最后一次在禁止时间段内是否执 ...

  5. 探究防抖(debounce)和节流(throttle)

    本文来自我的博客,欢迎大家去GitHub上star我的博客 本文从防抖和节流出发,分析它们的特性,并拓展一种特殊的节流方式requestAnimationFrame,最后对lodash中的deboun ...

  6. Java版的防抖(debounce)和节流(throttle)

    概念 防抖(debounce) 当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定时间到来之前,又触发了事件,就重新开始延时 节流(throttle) 当持续触发事件时, ...

  7. 函数防抖debounce和节流throttle

    debounce 函数防抖 1.什么是函数防抖 函数防抖是优化高频率执行 js 代码的一种手段 可以让被调用的函数在一次连续的高频率操作过程中只被调用一次 2.函数防抖的作用 减少代码执行次数,提升网 ...

  8. 防抖(debounce)和节流(throttle)

    针对一些会频繁触发的事件如scroll.resize,如果正常绑定事件处理函数的话,有可能在很短的时间内多次连续触发事件,十分影响性能.防抖和节流就是针对响应跟不上触发频率这类问题的两种解决方案 因此 ...

  9. 防抖(debounce) 和 节流(throttling)

    防抖和节流是针对响应跟不上触发频率这类问题的两种解决方案. 在给DOM绑定事件时,有些事件我们是无法控制触发频率的. 如鼠标移动事件onmousemove, 滚动滚动条事件onscroll,窗口大小改 ...

  10. 防抖(debounce) 和 节流(throttling)的封装使用-最终发布npm

    函数的防抖节流 前言 防抖函数 防抖函数(雏形) 防抖函数1.0(使用了闭包) 防抖函数2.0(此版本开始才称得上是封装) 防抖函数3.0(希望第一次点击就立即触发) 防抖函数4.0(解决this指向 ...

最新文章

  1. R语言return返回值的形式实战
  2. iPhone因安全漏洞上热搜,苹果:暂时无法修复,法国总统也中招
  3. python需要编译器吗_是否需要“使用严格”的Python编译器?
  4. C# 6.0语法新特性体验(二)
  5. raspberry pi_如何在Raspberry Pi上使用LÖVE游戏引擎对游戏进行编程
  6. 产品销售的过程中,价值是不断被定义和挖掘的
  7. ArcGIS 10.X功能增减(转)
  8. (转)Java ConcurrentModificationException异常原因和解决方法
  9. 使用Rider和Emmylua进行UnLua配置
  10. 程序员的核心竞争力是怎样的?列举程序员要掌握的能力
  11. R语言学习记录:主成分分析的R实现
  12. Parallels Desktop 17.x by TNT 出现网络初始化失败怎么办
  13. Mybatis 核心知识点整理成图
  14. google提示这个不是私密连接
  15. sapjco3的安装
  16. Vigenere加密算法
  17. 103个后台PSD源文件、素材网站
  18. 解决IDEA编译乱码 Build Output提示信息乱码�����
  19. 【程序源代码】微信交友小程序
  20. RAC:Oracle 11GR2 数据库一键安装

热门文章

  1. 去掉svn的蓝色问号
  2. python无限循环小数是有理数吗_证明:所有无限循环小数都是无理数
  3. 计算机断网后怎么连接网络连接,win7系统中网络经常掉线断网后又自动连接上怎么办...
  4. Educational Codeforces Round 101 (Rated for Div. 2)
  5. sql升级重启计算机失败win10,win10纯净版安装sql server 2008重启失败的解决办法
  6. CLIENT_PLUGIN_AUTH is required 解决办法
  7. 现阶段人工智能应用涉及到哪些行业?
  8. “造星工厂“乐华娱乐IPO,如何寻找下一个“王一博“?
  9. Matlab中hold on与hold off的用法
  10. android 4.4 zygote 开机速度,一种安卓系统快速开机的方法及装置的制造方法