在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 继承详解(二)
Jul 13 Javascript
jquery png 透明解决方案(推荐)
Aug 21 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
Oct 24 Javascript
jquery实现带复选框的表格行选中删除时高亮显示
Aug 01 Javascript
深入理解javascript中defer的作用
Dec 11 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
Sep 22 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
Jun 13 Javascript
Highcharts学习之数据列
Aug 03 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
Dec 04 Javascript
vue引入jq插件的实例讲解
Sep 12 Javascript
js实现全选反选不选功能代码详解
Apr 24 Javascript
微信小程序 云开发模糊查询实现解析
Sep 02 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
收音机的保养
2021/03/01 无线电
php线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
php workerman定时任务的实现代码
2018/12/23 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
js之onload事件的一点使用心得
2013/08/14 Javascript
常用的几段javascript代码分享
2014/03/25 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
javascript中this指向详解
2016/04/23 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
python 多线程中join()的作用
2020/10/29 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
CSS3实现内凹圆角的实例代码
2017/05/04 HTML / CSS
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
小学生安全保证书
2014/02/01 职场文书
青年文明号复核材料
2014/02/11 职场文书
会计学毕业生求职信
2014/06/25 职场文书
活动总结范文
2014/08/30 职场文书
大学生见习报告总结
2014/11/04 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
技术支持岗位职责
2015/02/13 职场文书
义诊活动通知
2015/04/24 职场文书
离婚答辩状范文
2015/05/22 职场文书
MySQL创建定时任务
2022/01/22 MySQL
CSS3实现指纹特效代码
2022/03/17 HTML / CSS
关于JS中的作用域中的问题思考分享
2022/04/06 Javascript