利用自定义 ref 实现函数防抖

今天来简单介绍一个新的方法,使用自定义 ref 实现函数防抖。

1. 自定义 ref 的来源

自定义 ref 防抖函数来自于前端开发中的两个概念:Vue 的响应式系统 和 数防抖(Debounce)。

1、Vue 响应式系统:Vue 提供了 ref 和 watch 来实现响应式数据更新,开发者可以通过 ref 定义响应式数据,并通过 watch 监控变化。

2、防抖(Debounce):防抖是一个在高频事件中避免性能消耗的常见技术。它的核心思想是将多次频繁触发的操作合并为一次,确保在设定时间内,事件只触发一次。

将两者结合,可以利用 Vue 的 ref 和防抖逻辑,在前端表单输入、搜索框等场景中高效地管理用户输入、限制高频操作,提升应用性能。

2. 原始写法(无自定义 ref)

在没有自定义 ref 的情况下,通常直接在事件处理函数中实现防抖。

在 Vue 中,这种方法通常通过 watch 或者在模板中绑定事件。不使用 v-model 处理,因为它是实时改变的。

🌰

<template>
  <input class="input" @input="handleInputChange($event.target.value)" />
  <div class="content">{{ inputValue }}</div>
</template>

<script setup>
import { ref } from 'vue'
const inputValue = ref('')
// 原始防抖函数实现
const debounce = (fn, delay) => {
  let timeout = null
  return function (...args) {
    if (timeout) {
      clearTimeout(timeout)
    }
    timeout = setTimeout(() => {
      fn.apply(this, args)
    }, delay)
  }
}
// 使用防抖处理输入
const handleInputChange = debounce((value) => {
  // 执行实际的输入处理逻辑
  inputValue.value = value
  console.log('输入内容:', value)
}, 300)
</script>

300ms 后,展示到 div 和 控制台中。

3. 自定义 ref 实现防抖(优化写法)

虽然原始写法可以满足基本的防抖需求,但在 Vue 中,我们希望利用其响应式特性,使数据的防抖处理与 Vue 的响应式系统深度结合。因此,使用自定义 ref 和 watch 可以更优雅地实现防抖逻辑。

🌰:

<template>
  <div>
    <input class="input" v-model="inputValue" />
    <p>实时输入的值: {{ inputValue }}</p>
    <p>防抖后的值: {{ debouncedValue }}</p>
  </div>
</template>

<script setup>
import { ref, watch } from 'vue'
// 自定义防抖 ref 的 Hook
function useDebouncedRef(initialValue, delay = 300) {
  const inputValue = ref(initialValue)
  const debouncedValue = ref(initialValue)
  let timeout = null
  watch(inputValue, (newValue) => {
    if (timeout) {
      clearTimeout(timeout)
    }
    timeout = setTimeout(() => {
      debouncedValue.value = newValue
    }, delay)
  })
  return {
    inputValue,
    debouncedValue
  }
}
// 使用自定义防抖 ref 实现
const { inputValue, debouncedValue } = useDebouncedRef('', 300)
</script>

展示为:

4. 利用 Vue 提供的 customRef 实现

不但可以自定义实现,还可以使用 Vue 提供专门产生一个自定义 ref 的API:customRef。

customRef 官方文档:https://cn.vuejs.org/api/reactivity-advanced

🌰:

<template>
  <div>
    <input class="input" v-model="debouncedInput" placeholder="输入防抖" />
    <div class="content">{{ debouncedInput }}</div>
  </div>
</template>

<script setup>
import { customRef } from 'vue'
// 创建防抖函数,返回一个 ref 数据
const useDebouncedRef = (initialValue, delay = 300) => {
  let timer = null
  return customRef((track, trigger) => ({
    get() {
      // 依赖收集
      track()
      return initialValue
    },
    set(val) {
      clearTimeout(timer)
      timer = setTimeout(() => {
        // 派发更新
        trigger()
        initialValue = val
      }, delay)
    }
  }))
}
const debouncedInput = useDebouncedRef('', 500) // 设置防抖延迟为500ms
</script>

当用户在输入框中输入内容时,debouncedInput 的值会被更新,但由于防抖的机制,输入内容的变化不会立即反映到视图中,而是会有一个延迟。

5. 优缺点

优点:

1、限制事件的触发次数,可以极大地降低性能损耗。

2、减少频繁发起请求,节省服务器资源,避免服务器过载。

3、在用户输入过程中,避免频繁触发事件可以使界面更加流畅,减少卡顿感,提升用户体验。

缺点:

在开发过程中引入额外的防抖逻辑和自定义处理,可能增加代码的复杂性,特别是在处理多个防抖场景时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/897372.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL 干货 | SQL 反连接

最强大的 SQL 功能之一是 JOIN 操作&#xff0c;它提供了一种优雅而简单的方法&#xff0c;将一个表中的每一条记录与另一个表中的每一条记录结合起来。不过&#xff0c;有时我们可能想从一个表中找到另一个表中没有的值。正如我们将在今天的博客文章中看到的&#xff0c;通过包…

爬虫结合项目实战

由于本人是大数据专业&#xff0c;所以准备的是使用pycharm工具进行爬虫爬取数据&#xff0c;然后实现一个可视化大屏 参考项目&#xff1a; 1.医院大数据可视化最后展示 2. 大数据分析可视化系统展示 代码包&#xff1a;

会话管理——Cookie

会话管理在人机交互中扮演着至关重要的角色&#xff0c;它是指保持用户的整个会话活动的互动与计算机系统跟踪过程。以下是对会话管理的简单介绍&#xff1a; 会话主要分为两类&#xff1a;有状态会话&#xff08;知道对方身份&#xff09;和无状态会话&#xff08;不知道对方…

go mod的使用

1. go中包的介绍和定义 包就是很多golang源码的集合&#xff0c;Go语言为我们提供了很多内置包&#xff0c;如fmt、strconv、strings、sort、errors、time、encoding/json、os、io等。 种类&#xff1a;1、系统内置包 2、自定义包 3、第三方包 系统内置包&…

计算机组成原理一句话

文章目录 计算机系统概述存储系统指令系统 计算机系统概述 指令和数据以同等地位存储在存储器中&#xff0c;形式上没有差别&#xff0c;但计算机应能区分他们。通过指令周期的不同阶段。 完整的计算机系统包括&#xff0c;1&#xff09;软件系统&#xff1a;程序、文档和数据&…

GEE引擎架设好之后进游戏时白屏的解决方法——gee引擎白屏修复

这两天测试GeeM2引擎的服务端&#xff0c;最常见的问题就是点击开始游戏出现白屏&#xff0c;最早还以为是服务端问题&#xff0c;结果是因为升级了引擎&#xff0c;而没有升级NewUI这份文件导致的。解决方法如下&#xff1a; 下载GEE引擎包最新版&#xff0c;&#xff08;可以…

C++实现精简实用的json解析库

fcjson.h #pragma once#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) #define _CRT_SECURE_NO_WARNINGS #endif#include <stdint.h> #include <string> #include <vector> #include <map>// VS 将执行字符集指定为…

Jupyter Notebook修改你的默认路径

Jupyter Notebook修改你的默认路径 看到网上一堆抄来抄去的博客&#xff0c;图片和文字都不对应&#xff0c;搞得配置得头昏脑涨的&#xff0c;所以写了这个。 1.打开 Anaconda Prompt 2.输入 jupyter notebook --generate-config&#xff0c;注意提示后输入N&#xff0c;因为…

【K8s】Kubernetes 证书管理工具 Cert-Manager

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

校招基础知识详解——计算机操作系统(内存管理)

文章目录 虚拟内存分页系统地址映射页面置换算法最佳页面置换算法(OPT, Optimal replacement algorithm)先进先出置换算法&#xff08;FIFO, First In First Out&#xff09;最近最久未使用的置换算法&#xff08;LRU, Least Recently Used&#xff09;最不常用算法最近未使用&…

Excel常用操作培训

1 Excel基本操作 1.1 常用快捷键 1.1.1快捷键操作工作簿、工作表 1.1.2快捷键操作 1.1.3单元格操作 1.1.4输入操作 2.1 常见功能描述 2.1.1 窗口功能栏 excel有很多功能可以用&#xff0c;新建文档后&#xff0c;可以最上方&#xff0c;可以看到所有的功能栏目 2.1.2 剪切板…

《YOLO目标检测》—— YOLO v2 详细介绍

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;未写完&#xff01;&#xff01;&#xff01;&#xff0…

Android中导入讯飞大模型ai智能系统

1.在讯飞大平台申请免费接口(申请后获取url和token) 2.创建一个数据库进行储存对话聊天记录 package com.example.myapplication.XL; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlit…

【SQL】SQL函数

&#x1f4e2; 前言 函数 是指一段可以直接被另一段程序调用的程序或代码。主要包括了以下4中类型的函数。 字符串函数数值函数日期函数流程函数 &#x1f384; 字符串函数 ⭐ 常用函数 函数 功能 CONCAT(S1,S2,...Sn) 字符串拼接&#xff0c;将S1&#xff0c;S2&#xff0…

Mongodb基础用法【总结】

关系型数据库和非关系型数据库的区别 关系型数据库 1.在关系型数据库中&#xff0c;数据都是存储在表中的&#xff0c;对存储的内容有严格的要求 2.因为我们在创建表的时候久已经规定了表中的字段 存储的数据类型 是否为空 唯一标识等规则 3.由于操作的都是结构化的数据&#…

一款.NET开源的i茅台自动预约小助手

前言 今天大姚给大家分享一款.NET开源、基于WPF实现的i茅台APP接口自动化每日自动预约&#xff08;抢茅台&#xff09;小助手&#xff1a;HyggeImaotai。 项目介绍 该项目通过接口自动化模拟i茅台APP实现每日自动预约茅台酒的功能&#xff0c;软件会在指定时间开始对管理的用…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第六篇-阶段总结篇】

因为马上就要进入下一个阶段&#xff0c;制作动态编辑体积纹理的模块。 但在这之前&#xff0c;要在这一章做最后一些整理。 首先&#xff0c;我们完成没完成的部分。其次&#xff0c;最后整理一下图表。最后&#xff0c;本文附上正在用的贴图 完善Shader 还记得我们之前注…

HBuilder X 中Vue.js基础使用1(三)

一、 模板语法 Vue 使用一种基于 HTML 的模板语法&#xff0c;使我们能够声明式地将其组件实例的数据绑定到呈现的 DOM 上。所有的 Vue 模板都是语法层面合法的 HTML&#xff0c;可以被符合规范的浏览器和 HTML 解析器解析。 英文官网: Vue.js - The Progressive JavaScript Fr…

浪潮云启操作系统(InLinux)bcache缓存实践:理解OpenStack环境下虚拟机卷、Ceph OSD、bcache设备之间的映射关系

前言 在OpenStack平台上&#xff0c;采用bcache加速ceph分布式存储的方案被广泛用于企业和云环境。一方面&#xff0c;Ceph作为分布式存储系统&#xff0c;与虚拟机存储卷紧密结合&#xff0c;可以提供高可用和高性能的存储服务。另一方面&#xff0c;bcache作为混合存储方案&…

Turn-it:优化线材重构雕塑制造

&#x1f428;文章摘要abstract 电线雕塑在工业应用和日常生活中都很重要。 本文提出了一种新的制造策略&#xff0c;通过调整目标形状以适应电线弯曲机&#xff0c;然后由人工将其弯曲回目标形状。&#xff08;机器弯曲人工弯曲&#xff09; 该方法通过两阶段弯曲策略实现&a…