当前位置: 首页 > news >正文

在vue3项目中利用自定义ref实现防抖

一,效果展示

自定义ref实现防抖效果

 

二,代码部分

1在app.vue中

<template><input v-model="text"/><p class="result">{{text}}</p>
</template><script setup>
import {debounceRef} from './unitls/debounceRef.js'
import {ref} from 'vue'const text = debounceRef('',1000)
</script><style scoped>
</style>

2,在debounceRef.js中

import {customRef} from 'vue';
export function debounceRef(value,delay=1000){let timer;return customRef((track,trigger)=>({get(){// 依赖收集track();return value;},set(val){clearTimeout(timer);timer = setTimeout(()=>{// 派发更新value = val;trigger();},delay);},}));
}

三,代码解释

 

 1. `import {customRef} from 'vue';` 这行代码是一个 `ES6` 模块的导入语句,从 `Vue` 库中导入了 `customRef` 这个函数。在 `Vue` 中,`customRef` 是一个用于创建自定义引用类型的工具函数,它允许开发者按照自己的需求来定义响应式数据的行为,比如控制数据的读取、更新等操作逻辑,使其更灵活地适应不同的业务场景。 

2. `export function debounceRef(value,delay=1000){` 这里定义了一个名为 `debounceRef` 的函数,并通过 `export` 关键字将其导出,以便在其他模块中可以引入并使用该函数。这个函数接收两个参数: - `value`:表示要处理的初始值,这个值会和最终创建的自定义引用类型相关联,后续可以通过这个自定义引用类型进行读取和更新操作。 - `delay`:是一个可选参数,默认值为 `1000`(单位应该是毫秒),用于指定防抖的延迟时间,即当数据更新时,会延迟一定时间后才真正去执行更新操作,在此期间如果有新的更新操作触发,会重新计时延迟。

 3. `let timer;` 在 `debounceRef` 函数内部声明了一个变量 `timer`,它用于存储定时器的标识。在后续实现防抖功能时,会借助 `setTimeout` 创建定时器来控制更新操作的延迟执行,而这个变量就是用来保存定时器的返回值(以便后续能通过 `clearTimeout` 来清除定时器)。

4. `return customRef((track,trigger)=>({` 这行代码开始返回一个由 `customRef` 创建的自定义引用类型。`customRef` 函数接收一个回调函数作为参数,这个回调函数又接收两个参数 `track` 和 `trigger`,它们的作用如下: - `track`:是一个函数,用于进行依赖收集。在自定义引用类型的 `get` 方法中调用它,能够告知 `Vue` 哪些地方使用了这个引用类型的数据,以便当数据变化时,相关依赖的地方能够正确地收到更新通知并重新渲染。 - `trigger`:同样是一个函数,用于触发视图更新。在自定义引用类型的 `set` 方法中,当满足一定条件(比如防抖延迟结束后)需要通知 `Vue` 去更新使用了该数据的相关视图时,调用这个函数来触发更新操作。 整体这行代码返回的是一个包含 `get` 和 `set` 方法的对象,这两个方法定义了自定义引用类型的数据读取和更新行为。

 5. `get(){` 这是自定义引用类型对象中的 `get` 方法定义,当在模板或者其他地方读取这个自定义引用类型所关联的数据时,就会触发这个 `get` 方法。

6. `// 依赖收集` 这是一个注释,用于提示下面这行代码的作用是进行依赖收集。

7. `track();` 在 `get` 方法内调用 `track` 函数,正如前面所述,它的作用是告诉 `Vue` 在这里使用了这个自定义引用类型的数据,`Vue` 会记录这个依赖关系,以便后续数据变化时能正确地更新相关依赖的地方。

 8. `return value;` 这行代码将传入 `debounceRef` 函数的初始 `value` 返回,也就是当读取这个自定义引用类型时,实际获取到的值就是最初传入的那个 `value` 。

9. `set(val){` 这是自定义引用类型对象中的 `set` 方法定义,当尝试更新这个自定义引用类型所关联的数据时(比如通过赋值操作),就会触发这个 `set` 方法。这里的 `val` 参数就是要更新的值。

10. `clearTimeout(timer);` 在 `set` 方法中,首先调用 `clearTimeout` 函数并传入之前声明的 `timer` 变量,目的是清除可能已经存在的定时器。因为如果在延迟时间还没结束时又有新的更新操作触发,就需要先把之前的定时器清除掉,重新开始计时延迟,以实现防抖的效果。

11. `timer = setTimeout(()=>{` 这行代码创建一个新的定时器,通过 `setTimeout` 函数来实现。它接收一个箭头函数作为参数,这个箭头函数内的代码会在延迟指定的 `delay` 时间(毫秒)后执行,也就是在防抖延迟结束后执行的逻辑。

 12. `// 派发更新` 这是一个注释,提示下面代码的作用是进行更新的派发操作,也就是触发视图更新。

 13. `value = val;` 在定时器的回调函数内,将传入 `set` 方法的更新值 `val` 赋给最初传入 `debounceRef` 函数的 `value` 变量,实现了对数据的更新操作。

 14. `trigger();` 调用 `trigger` 函数,正如前面所讲,它用于通知 `Vue` 去更新使用了该自定义引用类型数据的相关视图,触发视图更新,使得数据变化能够反映到页面上。

 15. `},delay);` 这是 `setTimeout` 函数调用的结尾部分,指定了前面设置的定时器的延迟时间,也就是按照传入 `debounceRef` 函数的 `delay` 参数(默认 `1000` 毫秒)来设置延迟,确保在延迟时间结束后才执行更新操作及触发视图更新。

四,总结

总的来说,这段代码定义了一个名为 `debounceRef` 的函数,利用 `Vue` 中的 `customRef` 函数创建了一个具有防抖功能的自定义引用类型。在实际使用中,通过这个自定义引用类型进行数据读取和更新时,更新操作会按照设定的防抖延迟时间来执行,避免频繁触发更新,适用于一些例如输入框输入内容后延迟搜索等需要防抖的业务场景。

 

 

相关文章:

在vue3项目中利用自定义ref实现防抖

一&#xff0c;效果展示 自定义ref实现防抖效果 二&#xff0c;代码部分 1在app.vue中 <template><input v-model"text"/><p class"result">{{text}}</p> </template><script setup> import {debounceRef} from ./u…...

服务器及MySQL安全设置指南

文章目录 Linux安全配置1、密码复杂度策略2、登陆失败策略3、登录超时策略4、安全日志记录5、账户策略5.1 创建系统管理员&#xff08;应该对/var进行授权&#xff0c;修改可能会影响到ssh登录&#xff09;5.2 创建安全管理员&#xff08;应该对/etc进行授权&#xff09;5.3 创…...

MDX语言的网络编程

MDX语言的网络编程探索 引言 在当今信息技术快速发展的时代&#xff0c;网络编程越来越成为软件开发的重要组成部分。无论是为了创建Web应用&#xff0c;还是为了开发与云服务交互的程序&#xff0c;网络编程的知识愈发显得重要。MDX&#xff08;Multidimensional Expression…...

client-go中watch机制的一些陷阱

Reference https://stackoverflow.com/questions/51399407/watch-in-k8s-golang-api-watches-and-get-events-but-after-sometime-doesnt-get-an 问题描述 最近在使用 client-go 的 watch 机制监听 k8s 中的 deployment 资源时&#xff0c;发现一个奇怪的现象 先看下代码&a…...

Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问

在访问网页的时候&#xff0c;因为浏览器自身的安全设置问题&#xff0c; 对于https的网页访问会出现安全隐私的提示&#xff0c; 甚至无法访问对应的网站&#xff0c;尤其是chrome浏览器&#xff0c; 因此本文主要讲解如何设置chrome浏览器的设置&#xff0c;来解决该问题&…...

Jenkins pipeline 发送邮件及包含附件

Jenkins pipeline 发送邮件及包含附件 设置邮箱开启SMTP服务 此处适用163 邮箱 开启POP3/SMTP服务通过短信获取TOKEN &#xff08;保存TOKEN, 后面Jenkins会用到&#xff09; Jenkins 邮箱设置 安装 Build Timestamp插件 设置全局凭证 Dashboard -> Manage Jenkins …...

怎么把word试题转成excel?

在教育行业、学校管理以及在线学习平台中&#xff0c;试题库的高效管理是一项核心任务。许多教育工作者和系统开发人员常常面临将 Word 中的试题批量导入 Excel 的需求。本文将详细介绍如何快速将试题从 Word 转换为 Excel&#xff0c;帮助您轻松解决繁琐的数据整理问题&#x…...

【机器学习】量子机器学习:当量子计算遇上人工智能,颠覆即将来临?

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 在当今科技飞速发展的时代&#xff0c;量子计算与人工智能宛如两颗璀璨的星辰&#xff0c;各自在不同的苍穹闪耀&#xff0c;正以前…...

IDEA配置maven和git并如何使用maven打包和git推送到gitlab

首先找到设置 在里面输入maven然后找到点击 然后点击右边两个选项 路径选择下载的maven目录下的settings文件和新建的repository文件夹 点击apply应用 然后在搜索框里搜git点击进去 此路径为git的exe执行文件所在目录&#xff0c;选好之后点击test测试下方出现git版本号表…...

Supermaven 加入 Cursor:AI 编码新篇章

引言 2024 年 11 月 11 日&#xff0c;我们迎来了一个激动人心的时刻——Supermaven 正式加入 Cursor&#xff01; 这一合作标志着 AI 编程工具进入了一个新的发展阶段&#xff0c;为开发者提供更智能、更高效的编码体验。本文将带您了解此次合并的背景、意义以及未来的发展方…...

【2024华为OD-E卷-100分-boss的收入】(题目+思路+JavaC++Python解析)

题目描述 题目&#xff1a;boss的收入 在一个公司中&#xff0c;有一个老板&#xff08;boss&#xff09;和若干名员工&#xff08;employees&#xff09;。老板和员工的收入信息存储在一个数组中&#xff0c;其中数组的每个元素表示一个人的收入。数组的第0个元素表示老板的…...

《Java8实战》汇总

参考书籍:《Java8 实战》 一、Lambda表达式 Lambda 是一个匿名函数。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。 1.1、Lambda表达式的关键:从匿名类到 Lambda 的转换 示例: <span style="background-color:#…...

Elasticsearch:搜索相关性

这里写目录标题 一、相关性的概述二、自定义评分策略1、TF-IDF算法2、BM25算法 三、自定义评分策略1、Index Boost&#xff1a;在索引层面修改相关性2、boosting&#xff1a;修改文档相关性3、negative_boost&#xff1a;降低相关性4、function_score&#xff1a;自定义评分5、…...

LeetCode 热题 100_二叉树展开为链表(46_114_中等_C++)(二叉树;先序遍历(递归+数组);先序遍历(递归))

LeetCode 热题 100_二叉树展开为链表&#xff08;46_114&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;先序遍历&#xff08;递归数组&#xff09;&#xff09;&#xff1a;思路二&#xff08;先序遍历&am…...

uniapp实现在card卡片组件内为图片添加长按保存、识别二维码等功能

在原card组件的cover属性添加图片的话&#xff0c;无法在图片上面绑定 show-menu-by-longpress"true"属性&#xff0c;通过将图片自定义添加可使用该属性。 代码&#xff1a; <uni-card title"标题" padding"10px 0" :thumbnail"avata…...

最好用的图文识别OCR -- PaddleOCR(2) 提高推理效率(PPOCR模型转ONNX模型进行推理)

在实际推理过程中&#xff0c;使用 PaddleOCR 模型时效率较慢&#xff0c;经测试每张图片的检测与识别平均耗时超过 5 秒&#xff0c;这在需要大规模自动化处理的场景中无法满足需求。为此&#xff0c;我尝试将 PaddleOCR 模型转换为 ONNX 格式进行推理&#xff0c;以提升效率。…...

Redis--20--大Key问题解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 大Key问题1.什么是 Redis 大 Key&#xff1f;在 Redis 中&#xff0c;大 Key 是指单个键值对的数据量非常大&#xff0c;可能包含大量数据。 2. Redis大Key的危害3.…...

新版2024AndroidStudio项目目录结构拆分

如题 下载了最新版的android studio 发现目录结构和以前不一样 自动帮你合并了 如何层层抽丝剥茧呢 按照一下步骤即可解决问题&#xff01;...

STM32内置Flash

一、原理 利用flash存储用户数据需要注意查看&#xff0c;用户数据是否会覆盖芯片运行程序。 IAP&#xff08;在程序中编程&#xff09;利用程序修改程序本身&#xff0c;和OTA是一个原理。IAP在程序中编程支持任意一种通信下载。 ICP&#xff08;在电路中编程&#xff0c;通…...

华为路由器、交换机、AC、新版本开局远程登录那些坑(Telnet、SSH/HTTP避坑指南)

关于华为设备远程登录配置开启的通用习惯1、HTTP/HTTPS相关服务 http secure-server enablehttp server enable 2、Telnet服务telnet server enable3、SSH服务stelnet server enablessh user admin authentication-type password 「模拟器、工具合集」复制整段内容 链接&…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...