在vue中使用防抖函数组件操作


Posted in Javascript onJuly 26, 2020

初级

1、先写好防抖函数

/**
 * @desc 防抖函数
 * @param {需要防抖的函数} func
 * @param {延迟时间} wait
 * @param {是否立即执行} immediate
 */
export function debounce(func, wait, immediate) {
 let timeout
 
 return function(...args) {
 let context = this
 if (timeout) clearTimeout(timeout)

 if (immediate) {
 let callNow = !timeout
 timeout = setTimeout(function() {
 timeout = null
 }, wait)
 if (callNow) func.apply(context, args)
 } else {
 timeout = setTimeout(function() {
 func.apply(context, args)
 }, wait)
 }
 }
}

2、然后在要使用的组件里 import 进来

import { debounce } from 'xxx'

export default {
 data: {
 return {
 vm: this
 }
 },
 methods: {
 toDoSth: debounce((vm) => {
 // 这里将当前组件实例当参数传入
 // 就可以使用实例中定义的一些属性、方法
 // 补充一下,这里如果换成非箭头函数的写法,也可以直接访问实例。
 }, 
 500, 
 true
 )
 }
}

3、在组件方法中使用

template:

<div @click="toDoSth(vm)"></div>

高级

虽然上面的写法已经能解决问题了,但是总觉得不够美观。

在网上搜索一番,看到有个哥们将防抖封装成一个组件,果然和我想的一样。不过这哥们直接将上下文当参数传进来了,比我把整个实例传进来高明,我在这个基础上添加了 immediate 的功能,还有添加了默认不传 event 参数的情况处理。

debounce.js 文件:

import Vue from 'vue'

const debounce = (func, time, ctx, immediate) => {
 let timer
 const rtn = (...params) => {
 clearTimeout(timer)

 if (immediate) {
 let callNow = !timer
 timer = setTimeout(() => {
 timer = null
 }, time)
 if (callNow) func.apply(ctx, params)
 } else {
 timer = setTimeout(() => {
 func.apply(ctx, params)
 }, time)
 }
 }
 return rtn
}

Vue.component('Debounce', {
 abstract: true,
 props: ['time', 'events', 'immediate'],
 created() {
 this.eventKeys = this.events && this.events.split(',')
 },
 render() {
 const vnode = this.$slots.default[0]
 
 // 如果默认没有传 events,则对所有绑定事件加上防抖
 if (!this.eventKeys) {
 this.eventKeys = Object.keys(vnode.data.on)
 }
 
 this.eventKeys.forEach(key => {
 vnode.data.on[key] = debounce(
 vnode.data.on[key],
 this.time,
 vnode,
 this.immediate
 )
 })

 return vnode
 }
})

使用方式:

1、引入 debounce.js 文件

import 'xxx/debounce.js'

export default {
 methods: {
 toDoSth(e) {
 // 这里正常写就可以了
 }
 }
}

2、在模版里使用

其中time为必选参数。 event 和 immediate 参数都是可选参数。

如果组件下有多个事件绑定,那么 event 可以自定义需要进行防抖处理的事件。

如果需要立即执行的话,可以将 immediate 参数设置为 true。

<Debounce :time="500" event="click" :immediate="true">
 <button @click="toDoSth($event, 1)">click me</button>
</Debounce>

到此就完成了一次 Debounce 组件的封装。

补充知识:vue防抖函数,避免暴力点击

1.vue项目/src/components/directive/clickAgain.js

import Vue from 'vue'

const clickAgain = Vue.directive('clickAgain',{
 // 指令的定义
 bind(el, binding, vnode, oldVnode) {
  // 绑定this
  let self = vnode.context;
  el.onclick = function (e) {
   if (self._is_click) {
    return false;
   }
   /*执行指令绑定的事件*/
   self[binding.expression]()
   self._is_click=true;
   setTimeout(()=>{
    self._is_click=false;
   },2000)

  };
 }
});
export default clickAgain

2.在main.js 引入

import clickAgain from './components/directive/clickAgain.js'

/* 引入避免暴力双击点击*/

Vue.use(clickAgain);

3.使用

<a-button key="submit" type="primary" :loading="false" v-clickAgain="handleOk">
 保存
</a-button>

以上这篇在vue中使用防抖函数组件操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
Jan 18 Javascript
Jquery实现三层遍历删除功能代码
Apr 23 Javascript
php 中序列化和json使用介绍
Jul 08 Javascript
jquery 新建的元素事件绑定问题解决方案
Jun 12 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
Jun 23 Javascript
Javascript for in的缺陷总结
Feb 03 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
Apr 29 jQuery
vue2.0 循环遍历加载不同图片的方法
Mar 06 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
Aug 25 Javascript
vue.js单文件组件中非父子组件的传值实例
Sep 13 Javascript
微信小程序转发事件实现解析
Oct 22 Javascript
vue 使用async写数字动态加载效果案例
Jul 18 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
Jul 26 #Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
Jul 26 #Javascript
关于vue 结合原生js 解决echarts resize问题
Jul 26 #Javascript
Element Tooltip 文字提示的使用示例
Jul 26 #Javascript
Element Popover 弹出框的使用示例
Jul 26 #Javascript
Element Card 卡片的具体使用
Jul 26 #Javascript
Element Carousel 走马灯的具体实现
Jul 26 #Javascript
You might like
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
php程序的国际化实现方法(利用gettext)
2011/08/14 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
php遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
2018/06/06 PHP
javascript中递归函数用法注意点
2015/07/30 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
es6数值的扩展方法
2019/03/11 Javascript
JavaScript位置参数实现原理及过程解析
2020/09/14 Javascript
[48:31]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第一场 2月2日
2021/03/11 DOTA
python调用cmd复制文件代码分享
2013/12/27 Python
Python线程中对join方法的运用的教程
2015/04/09 Python
10个Python小技巧你值得拥有
2018/09/29 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
Python八皇后问题解答过程详解
2019/07/29 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
python实现图片素描效果
2020/09/26 Python
什么是事务?为什么需要事务?
2012/01/09 面试题
什么是Smart Navigation?
2016/07/03 面试题
求职信模版
2013/11/30 职场文书
协议书与合同的区别
2014/04/18 职场文书
学校评语大全
2014/05/06 职场文书
大专生找工作自荐书
2014/06/10 职场文书
关心下一代工作先进事迹
2014/08/15 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
商务信函英语问候语
2015/11/10 职场文书
一文带你探究MySQL中的NULL
2021/11/11 MySQL
Python实现提取PDF简历信息并存入Excel
2022/04/02 Python
利用Apache Common将java对象池化的问题
2022/06/16 Servers