在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判断用户浏览器是否是XP SP2的IE6
Mar 08 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
Jul 31 Javascript
Eclipse配置Javascript开发环境图文教程
Jan 29 Javascript
很棒的js选项卡切换效果
Jul 15 Javascript
jQuery动态创建元素以及追加节点的实现方法
Oct 20 Javascript
教你快速搭建Node.Js服务器的方法教程
Mar 30 Javascript
解决VUEX刷新的时候出现数据消失
Jul 03 Javascript
js封装成插件的步骤方法
Sep 11 Javascript
原生javascript实现的全屏滚动功能示例
Sep 19 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
Feb 01 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
Sep 18 Javascript
javascript的delete运算符知识点总结
Nov 19 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下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
php 团购折扣计算公式
2011/11/24 PHP
PHP应用JSON技巧讲解
2013/02/03 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
laravel框架关于搜索功能的实现
2018/03/15 PHP
laravel5使用freetds连接sql server的方法
2018/12/07 PHP
laravel-admin的多级联动方法
2019/09/30 PHP
prototype 学习笔记整理
2009/07/17 Javascript
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
2010/04/25 Javascript
25个优雅的jQuery Tooltip插件推荐
2011/05/25 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
JavaScript生成简单等差数列
2017/11/28 Javascript
vue单页应用在页面刷新时保留状态数据的方法
2018/09/21 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
jQuery实现简单弹幕制作
2020/12/10 jQuery
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
Python深入学习之装饰器
2014/08/31 Python
Python if语句知识点用法总结
2018/06/10 Python
Python for循环与getitem的关系详解
2020/01/02 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
Python如何脚本过滤文件中的注释
2020/05/27 Python
Pycharm安装第三方库失败解决方案
2020/11/17 Python
Origins悦木之源英国官网:雅诗兰黛集团高端植物护肤品牌
2017/11/06 全球购物
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
出国留学自荐信
2013/10/25 职场文书
电子商务网站的创业计划书
2014/01/05 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
门卫岗位职责说明书
2014/08/18 职场文书
个人售房合同协议书
2016/03/21 职场文书
springboot+VUE实现登录注册
2021/05/27 Vue.js