在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 相关文章推荐
jQuery实现的Email中的收件人效果(按del键删除)
Mar 20 Javascript
分享20多个很棒的jQuery 文件上传插件或教程
Sep 04 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
Jul 10 Javascript
在页面加载完成后通过jquery给多个span赋值
May 21 Javascript
JavaScript实现按Ctrl键打开新页面
Sep 04 Javascript
js下将金额数字每三位一逗号分隔
Feb 19 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
Dec 13 Javascript
Vuex之理解Getters的用法实例
Apr 19 Javascript
Node.JS文件系统解析实例详解
May 15 Javascript
JavaScript之map reduce_动力节点Java学院整理
Jun 29 Javascript
js注册时输入合法性验证方法
Oct 21 Javascript
js中实现继承的五种方法
Jan 25 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
PHP+MySQL 制作简单的留言本
2009/11/02 PHP
简单的自定义php模板引擎
2016/08/26 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
iframe子父页面调用js函数示例
2013/11/07 Javascript
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
2015/03/11 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
js中Number数字数值运算后值不对的解决方法
2017/02/28 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
jQuery实现移动端图片上传预览组件的方法分析
2020/05/01 jQuery
vue实现购物车列表
2020/06/30 Javascript
[46:20]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
python 回调函数和回调方法的实现分析
2016/03/23 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
对Python 中矩阵或者数组相减的法则详解
2019/08/26 Python
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
canvas简易绘图的实现(海绵宝宝篇)
2018/07/04 HTML / CSS
Kipling澳洲官网:购买凯浦林包包
2020/12/17 全球购物
Python里面如何拷贝一个对象
2014/02/17 面试题
2014迎新年晚会策划方案
2014/02/23 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
婚礼主持词开场白
2014/03/13 职场文书
银行贷款承诺书
2014/03/29 职场文书
离婚案件被告代理词
2015/05/23 职场文书