Vue3 自定义指令实现元素点击的节流与输入框的防抖,后端老哥再也不用担心我频繁发送请求了

简介: Vue3 自定义指令实现元素点击的节流与输入框的防抖,后端老哥再也不用担心我频繁发送请求了

在我们项目开发的时候,很多时候都会用到节流和防抖来防止用户频繁操作从而造成资源与服务器的浪费。所以作为一个前端我们往往需要在合适的位置加上防抖或者节流。本篇文章将介绍如何使用 Vue3 自定义指令的方式实现元素点击节流指令v-throttleClick和输入框的防抖指令v-debounceInput


防抖和节流的定义



在开始之前,我们先了解一下什么是防抖,什么是节流。

防抖是指当你触发一个事件的时候,它的回调不会立即执行,而是在 n 秒之后执行,但当在这 n 秒之内你又触发了这个事件,则会重新计时,也就是你还需要再等 n 秒才会执行。

节流是指当你触发一个事件的时候,它会立刻执行回调,但是如果你在 n 秒之内再次触发,回调不再执行,也就是说单位时间内触发事件只会执行一次回调

了解了防抖和节流之再看如何实现v-throttleClickv-debounceInput


元素点击节流:v-throttleClick



我们先看下v-throttleClick要实现的效果:指令接受一个回调函数,当给元素绑定这个指令的时候,点击该元素则会以节流的形式触发改回调函数。同时接收一个 arg 作为节流事件,默认 1000ms

实现起来其实很简单

<template>
  <button v-throttleClick:2000="kfc50">点击V我50吃鸡脚</button>
</template>
<script setup>
const vThrottleClick = (el, bind) => {
  let isPass = true;
  el.addEventListener("click", () => {
    if (typeof bind.value !== "function") return;
    if (isPass) {
      bind.value();
      isPass = false;
      setTimeout(() => {
        isPass = true;
      }, bind.arg || 1000);
    }
  });
};
const kfc50 = () => {
  console.log("+50");
};
</script>

然后我们频繁点击按钮看效果

image.png

但是如果我们直接在回调函数中传参,函数就会立即执行,比如

<button v-throttleClick:2000="kfc50(1)">点击V我50吃鸡脚</button>

并且点击之后也不会进入逻辑判断,因为 bind.value 不再是个函数。所以如果有传参需求,则需要将回调写成高阶函数形式

const kfc50 = (arg1) => {
  return () => {
    console.log(arg1);
  };
};

到这里一个简单的v-throttleClic指令就完成了。那么它可以用作什么场景呢? 比如你有一个搜索按钮,你肯定不能在用户疯狂点击的时候一直发请求吧,那就加一个 v-throttleClick 指令吧


输入框防抖v-debounceInput



假如你有这样一个需求,用户不停的在输入框输入内容,当用户停止输入的时候再触发搜索向后台发送请求。这时候聪明的你一定想到了防抖(你慢慢抖吧,等你抖完了我再给请你吃 kfc)

同样的指令接收一个 arg 和 value,直接看代码实现

<template>
  <input v-debounceInput:500="toKfc" />
</template>
<script setup>
const vDebounceInput = (el, bind) => {
  if (typeof bind.value !== "function") return;
  bind.value.id = null;
  el.addEventListener("input", () => {
    clearTimeout(bind.value.id);
    bind.value.id = setTimeout(() => {
      bind.value();
    }, bind.arg || 1000);
  });
};
const toKfc = () => {
  console.log("优弧请我吃kfc");
};
</script>

然后我们看下效果

image.png


全局注册指令



如果我们想要在每个组件都能使用这两个指令,我们可以将其注册到全局。我们可以在 main.js 中进行注册,以 debounceInput 为例

import { createApp } from "vue";
import "./style.css";
import App from "./App.vue";
const app = createApp(App);
app.directive("debounceInput", (el, bind) => {
  if (typeof bind.value !== "function") return;
  bind.value.id = null;
  el.addEventListener("input", () => {
    clearTimeout(bind.value.id);
    bind.value.id = setTimeout(() => {
      bind.value();
    }, bind.arg || 1000);
  });
});
app.mount("#app");


写在最后



vue 的自定义指令在平时工作中用到的地方还是很多的,比如权限管理,事件埋点等等都可以使用指令实现,非常的方便,所以对 vue 自定义指令还不熟悉的小伙伴可以直接到官网查看文档


相关文章
|
存储 JavaScript
vue页面跳转取消上一个页面请求
本文介绍了在Vue中如何取消上一个页面的请求,以避免页面跳转时请求未完成导致的数据错误。核心方法是使用axios的请求拦截器设置请求的取消令牌(cancelToken),并在vuex中存储这些取消令牌的引用。当进行路由跳转时,通过路由守卫清除这些请求,达到取消上一个页面请求的目的。
534 2
|
5月前
|
监控 Java 应用服务中间件
低并发编程|如何用720个请求让后端服务器瘫痪
本次故障因应用启动时未有效校验核心依赖模块初始化异常,导致后续请求处理中抛出无法捕获的错误,引发线程阻塞,最终耗尽HSF线程池,服务不可用。排查发现类初始化失败且异常未被正确处理,结合线程无限等待问题,确认为依赖初始化异常与流处理中断所致。修复措施包括加强启动校验、捕获Throwable及设置合理超时。总结指出,系统稳定性需从细节入手,防微杜渐,避免连锁故障。
低并发编程|如何用720个请求让后端服务器瘫痪
|
6月前
|
自然语言处理 JavaScript 前端开发
一夜获千星!已获 1.7k+,Art Design Pro:Vue3 + Vite + TypeScript 打造的高颜值管理系统模板,这个让后端小哥直呼救命的后台系统
Art Design Pro 是一款基于 Vue 3、Vite 和 TypeScript 的高颜值后台管理系统模板,已获 1.7k+ 星标。项目专注于用户体验与视觉设计,支持主题切换、多语言、权限管理及图表展示等功能,内置常用业务组件,便于快速搭建现代化管理界面。其技术栈先进,开发体验流畅,适配多设备,满足企业级应用需求。项目地址:[GitHub](https://github.com/Daymychen/art-design-pro)。
1015 11
|
缓存 前端开发 中间件
[go 面试] 前端请求到后端API的中间件流程解析
[go 面试] 前端请求到后端API的中间件流程解析
|
JavaScript 前端开发
vue3教程,如何手动获取后端数据(入门到精通3,新人必学篇)
本文提供了一个Vue 3教程,讲解了如何使用axios库手动从后端获取数据,包括安装axios、配置后端访问地址、编写路由地址、发起HTTP请求以及在组件中读取和打印响应数据的步骤。
2167 0
vue3教程,如何手动获取后端数据(入门到精通3,新人必学篇)
|
前端开发 Java
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
文章介绍了如何使用SpringBoot创建简单的后端服务器来处理HTTP请求,包括建立连接、编写Controller处理请求,并返回响应给前端或网址。
354 0
学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例
|
JSON JavaScript 前端开发
js请求后端9
js请求后端9
113 2
|
存储 缓存 移动开发
不来看一看HTML请求后端性能优化的实战总结吗?
本文主要总结了在ICBU的核心沟通场景下服务端在此次性能优化过程中做的工作,供大家参考讨论。
|
小程序 安全
Fiddler抓取小程序后端请求导入AppScan扫描快捷方法
【8月更文挑战第26天】这是一种利用 Fiddler 捕获小程序后端请求并导入 AppScan 进行安全扫描的方法。首先安装配置 Fiddler 并设置手机代理,通过 Fiddler 捕获请求;接着导出这些请求为 .saz 文件,并在 AppScan 中导入此文件,配置扫描参数后启动扫描以检测安全漏洞。操作时需确保有合法授权并遵循相关法规。尽管不同版本软件操作细节可能有所不同,但整体流程类似。
632 1
|
JavaScript UED
以 Vue 3 项目为例,多个请求下如何全局封装 Loading 的展示与关闭?其中大有学问!
以 Vue 3 项目为例,多个请求下如何全局封装 Loading 的展示与关闭?其中大有学问!