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

news2025/1/11 2:02:01

一,效果展示

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

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL表的增删查改(下)——Update(更新),Delete(删除)

文章目录 Update将孙悟空同学的数学成绩修改为80分将曹孟德同学的数学成绩变更为 60 分&#xff0c;语文成绩变更为 70 分将总成绩倒数前三的 3 位同学的数学成绩加上 30 分将所有同学的语文成绩更新为原来的 2 倍 Delete删除数据删除孙悟空同学的考试成绩删除整张表数据 截断表…

Virgo:增强慢思考推理能力的多模态大语言模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

聚类系列 (二)——HDBSCAN算法详解

在进行组会汇报的时候&#xff0c;为了引出本研究动机&#xff08;论文尚未发表&#xff0c;暂不介绍&#xff09;&#xff0c;需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候&#xff0c;发现网络上对于DBSCAN算法的介绍非常多与细致&#xff0c;但…

零基础 监控数据可视化 Spring Boot 2.x(Actuator + Prometheus + Grafana手把手) (上)

一、安装Prometheus Releases prometheus/prometheus GitHubhttps://github.com/prometheus/prometheus/releases 或 https://prometheus.io/download/https://prometheus.io/download/ 1. 下载适用于 Windows 的二进制文件&#xff1a; 找到最新版本的发布页面&#xf…

解决Qt打印中文字符出现乱码

在 Windows 平台上&#xff0c;默认的控制台编码可能不是 UTF-8&#xff0c;这可能会导致中文字符的显示问题。 下面是在 Qt 应用程序中设置中文字体&#xff0c;并确保控制台输出为 UTF-8 编码&#xff1a; 1. Qt 应用程序代码 在 Qt 中&#xff0c;我们可以使用 QApplic…

PDFelement 特别版

Wondershare PDFelement Pro 是一款非常强大的PDF编辑软件&#xff0c;它允许用户轻松地编辑、转换、创建和管理PDF文件。这个中文特别版的软件具有许多令人印象深刻的功能&#xff0c;PDFelement Pro 提供了丰富的编辑功能&#xff0c;可以帮助用户直接在PDF文件中添加、删除、…

SpringBoot-Web入门-入门程序

1.如何创建一个springBoot-Web工程&#xff1f; 实战演示&#xff1a; 新建一个模块&#xff0c;找到Spring Boot选项 点击下一步之后&#xff0c;选择勾选对应的依赖。我这里勾选的是web下的Spring Web 创建完毕之后&#xff0c;在src的main下的java对应的包下创建一个Contro…

从光子到图像——相机如何捕获世界?

引言 你是否想过为何我们按一下相机快门就可以将眼前广袤多彩的世界显示于一个小小的相机屏幕上&#xff1f;本期推文中将带着大家重现从光子转换为电子、电子转换为图像中数字驱动值的整个流程。 ▲人们通过相机捕获眼前的场景 从光子到电子的转换 光线首先通过光学镜头进入相…

《机器学习》——贝叶斯算法

贝叶斯简介 贝叶斯公式&#xff0c;又称贝叶斯定理、贝叶斯法则&#xff0c;最初是用来描述两个事件的条件概率间的关系的公式&#xff0c;后来被人们发现具有很深刻的实际意义和应用价值。该公式的实际内涵是&#xff0c;支持某项属性的事件发生得愈多&#xff0c;则该属性成…

【非常详细】TCP/IP协议详解

一、TCP/IP简介 TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;是一种用于连接网络设备的协议族&#xff0c;广泛应用于互联网和局域网中。它提供了在不同类型的网络上进行通信的标准和方法。 二、TCP/IP模型 TCP/IP在数据包设计上采用封装和分用的策略&#xff0c;…

Nginx代理同域名前后端分离项目的完整步骤

前后端分离项目&#xff0c;前后端共用一个域名。通过域名后的 url 前缀来区别前后端项目。 以 vue php 项目为例。直接上 server 模块的 nginx 配置。 server{ listen 80; #listen [::]:80 default_server ipv6onlyon; server_name demo.com;#二配置项目域名 index index.ht…

C++中的表达式

文章目录 算数操作符位操作符bitset对象或整型值的使用将位移操作符用作IO 赋值操作符赋值操作符的右结合性赋值操作具有低优先级 自增和自减操作符条件操作符sizeof操作符优先级new和delete表达式类型转换何时发生隐式转换显示转换旧式强制类型转换 C中的表达式由一个或多个操…

WebSocket 测试入门篇

Websocket 是一种用于 H5 浏览器的实时通讯协议&#xff0c;可以做到数据的实时推送&#xff0c;可适用于广泛的工作环境&#xff0c;例如客服系统、物联网数据传输系统&#xff0c; 基础介绍 我们平常接触最多的是 http 协议的接口&#xff0c;http 协议是请求与响应的模式&…

海外招聘丨 弗拉瑞克商学院—博士研究员:智能家居技术业务和能源管理中的数据分析和人工智能

雇主简介 Vlerick 是一所领先的国际商学院……与众不同。是的&#xff0c;我们提供完全认可的世界一流教育课程&#xff0c;将理论知识和实践见解完美结合。是的&#xff0c;我们是一家领先的学术机构&#xff0c;拥有创新和独立研究的悠久传统。是的&#xff0c;我们拥有国际…

NUTTX移植到STM32

STM32移植NUTTX 1. Ubuntu下搭建开发环境1.1 先决条件1.2 下载 NuttX1.3 使用Make 进行编译1.4 烧录运行 2.通过NUTTX点亮LED2.1 部署操作系统2.2 修改配置文件2.3 编译运行程序 开发板&#xff1a;DshanMCUF407 官方开发文档&#xff1a;安装 — NuttX latest 文档 参考文档&…

Redis 优化秒杀(异步秒杀)

目录 为什么需要异步秒杀 异步优化的核心逻辑是什么&#xff1f; 阻塞队列的特点是什么&#xff1f; Lua脚本在这里的作用是什么&#xff1f; 异步调用创建订单的具体逻辑是什么&#xff1f; 为什么要用代理对象proxy调用createVoucherOrder方法&#xff1f; 对于代码的详细…

Python 中的错误处理与调试技巧

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

关于腾讯4K算法搭建使用

准备国内服务器一台&#xff0c;轻量服务器请尽量开全端口安装linux,centos7.6-7.9系统&#xff0c;记住纯净系统&#xff0c;然后安装宝塔宝塔安装环境为nginx1.24,7.2(PHP版本没有要求)&#xff0c;Mysql5.7(没有要求) 准备活动完毕&#xff01;&#xff01;&#xff01; 上传…

工艺参数优化、工程设计优化!GRNN神经网络+NSGAII多目标优化算法(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.GRNN神经网络NSGAII多目标优化算法&#xff0c;工艺参数优化、工程设计优化&#xff08;Matlab完整源码和数据&#xff09; 多目标优化是指在优化问题中同时考虑多个目标的优化过程。在多目标优化中&#xff0c;通…

【Rust自学】11.6. 控制测试运行:并行和串行(连续执行)测试

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.6.1. 控制测试的运行方式 cargo test和cargo run一样&#xff0c;cargo test也会编译代…