当前位置: 首页 > 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 「模拟器、工具合集」复制整段内容 链接&…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...