Vue2之防抖_debounce封装函数v-debounce自定义指令(传参/不传)

news/2024/7/10 0:10:01 标签: 前端, Vue, javascript

目录

1、防抖

2、debounce - 封装函数

3、v-debounce 全局自定义指令


1、防抖

推荐文章 :

https://blog.csdn.net/weixin_58099903/article/details/119902796


2、debounce - 封装函数

utils / tools.js

javascript">/**
 * 函数防抖 是n秒后延迟执行,多用于页面scroll滚动,窗口resize,防止按钮重复点击
 * @param {Function} fn 是我们需要包装的事件回调
 * @param {Number} delay 是每次推迟执行的等待时间
 * @returns
 */
export default function (fn, delay) {
	// 记录上一次触发的时间
	var timer = null;
	return function () {
		// 保留调用时的this上下文
		var context = this;
		// 保留调用时传入的参数
		var args = arguments;
		// 每次事件被触发时,都去清除上一次延时器
		if (timer) clearTimeout(timer);
		// 设立新的定时器
		timer = setTimeout(function () {
			fn.apply(context, args);
		}, delay);
	};
};

使用 :

<template>
  <div>
    <!-- debounce封装函数用法 -->
    <el-button @click="submitForm(item.id)">防抖</el-button>
  </div>
</template>

<script>
import { debounce } from '../utils/tools';

export default {
  methods: {
    submitForm: debounce(function (id) {
      console.log('防抖', id);
    }, 1000),
  },
};
</script>

3、v-debounce 全局自定义指令

utils / directives.js

javascript">/**
 * v-debounce 防抖指令 防止重复点击
 * @param {Function} fn 方法名【必传】
 * @param {*} params 函数参数
 * @param {String} event 触发方式click
 * @param {Number} delay 防抖时间1000
 */
const debounce = Vue.directive('debounce', {
	inserted: function (el, binding) {
		let timer; // 定时器
		const { fn, params, event, delay } = binding.value;
		el.addEventListener(event || 'click', () => {
			// 每次事件被触发时,都去清除之前旧的定时器
			if (timer) clearTimeout(timer);
			// 设立新的定时器
			if (binding.value.hasOwnProperty('params')) {
				// 传参用法:v-debounce="{ fn: 方法名, params: '传参', delay: 防抖时间 }"
				timer = setTimeout(() => {
					fn(params);
				}, delay || 1000);
			} else {
				// 不传参用法:v-debounce="方法名"
				timer = setTimeout(() => {
					binding.value();
				}, 1000);
			}
		});
	},
});

export { debounce };

使用 :

javascript">// main.js 中引用
import "./utils/directives";
<!-- 不传参用法 -->
<el-button v-debounce="submitForm">防抖</el-button>
<!-- 传参用法 -->
<el-button
  v-debounce="{
    fn: submitForm,
    params: item.id,
    event: 'click',
    delay: 1000,
  }"
  >防抖</el-button
>

  methods: {
    submitForm (id) {
      console.log('防抖', id);
    },
  },


http://www.niftyadmin.cn/n/5107342.html

相关文章

踩坑记 BSS段的初始化

title: 踩坑记 BSS段的初始化 category_bar: true categories: blog tags:embedded date: 2023-10-20 19:23:05 前言 接手一个项目&#xff0c;调试全靠串口日志&#xff0c;测试同事测试产品的时候无法拿到日志&#xff0c;刚好产品RAM够大&#xff0c;且刚好有SD卡。所以就…

[论文笔记]GPT1

引言 今天带来论文Improving Language Understanding by Generative Pre-Training的笔记,它的中文题目为:通过生成式预训练改进语言理解。其实就是GPT的论文。 自然语言理解可以应用于大量NLP任务上,比如文本蕴含、问答、语义相似和文档分类。虽然无标签文本语料是丰富的,…

2023.10.20 LED驱动

驱动程序 #include<linux/init.h> #include<linux/module.h> #include<linux/fs.h> #include<linux/uaccess.h> #include<linux/io.h> #include"head.h"unsigned int major; unsigned int *vir_moder; unsigned int *vir_odr; unsign…

代码随想录算法训练营Day58|动态规划16

代码随想录算法训练营Day58|动态规划16 文章目录 代码随想录算法训练营Day58|动态规划16一、583. 两个字符串的删除操作二、72. 编辑距离 一、583. 两个字符串的删除操作 class Solution {public int minDistance(String word1, String word2) {int len1 word1.length();int …

订水商城H5实战教程-01需求分析

目录 1 用户分析2 模块分析3 原型设计3.1 首页3.2 商城3.3 一键订购3.4 我的3.5 确认订单3.6 地址管理3.7 编辑地址3.8 搜索3.9 搜索结果3.10 充值3.11 我的订单3.12 开票信息3.13 优惠券3.14 我的空桶3.15 商品详情3.16 购物车3.17 门店信息3.18 订单详情 总结 生活中&#xf…

代码随想录算法训练营第23期day26|39. 组合总和、40.组合总和II、131.分割回文串

目录 一、&#xff08;leetcode 39&#xff09;组合总和 二、&#xff08;leetcode 40&#xff09;组合总和II 三、&#xff08;leetcode 131&#xff09;分割回文串 一、&#xff08;leetcode 39&#xff09;组合总和 力扣题目链接 状态&#xff1a;基本回溯AC&#xff0c…

SpringBoot (2) yaml,整合项目

目录 1 YAML配置文件 1.1 书写规则 1.2 代码示例 1.3 用yaml进行复杂数据绑定 2 整合日志 2.1 日志配置 3 整合web 3.1 默认配置 3.2 web应用开发方式 3.2.1 全自动 3.2.2 全手动 3.2.3 手自一体(推荐) 4 整合mybatis 4.1 导包 4.2 application.yaml 4.3 dao接…

C++类对象所占内存空间大小分析

前言 类占内存空间是只类实例化后占用内存空间的大小&#xff0c;类本身是不会占内存空间的。用 sizeof 计算类的大小时&#xff0c;实际上是计算该类实例化后对象的大小。空类占用1字节原因&#xff1a;C要求每个实例在内存中都有一个唯一地址&#xff0c;为了达到这个目的&am…