在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 相关文章推荐
日期 时间js控件
May 07 Javascript
Jquery为单选框checkbox绑定单击click事件
Dec 18 Javascript
JS 实现导航栏悬停效果(续)
Sep 24 Javascript
Javascript中call的两种用法实例
Dec 13 Javascript
一个很有趣3D球状标签云兼容IE8
Aug 22 Javascript
JavaScript数据结构和算法之二叉树详解
Feb 11 Javascript
javascript匀速运动实现方法分析
Jan 08 Javascript
jquery中validate与form插件提交的方式小结
Mar 26 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
Feb 20 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
Mar 22 Javascript
详解js中Array的方法及技巧
Sep 12 Javascript
vue.js编译时给生成的文件增加版本号
Sep 17 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统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
JQuery处理json与ajax返回JSON实例代码
2014/01/03 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
webpack4打包vue前端多页面项目
2018/09/17 Javascript
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
Vue watch响应数据实现方法解析
2020/07/10 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
Python基于win32ui模块创建弹出式菜单示例
2018/05/09 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
详解Python IO口多路复用
2020/06/17 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
物业管理公司实习生自我鉴定
2013/09/19 职场文书
大学生求职推荐信
2013/11/27 职场文书
2014小学数学教研组工作总结
2014/12/06 职场文书
2014年校长工作总结
2014/12/11 职场文书
保研推荐信格式
2015/03/25 职场文书
旅游投诉信范文
2015/07/02 职场文书
图书馆义工感想
2015/08/07 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书