Vue - customRef 自定义ref

customRef 作用:创建一个自定义的 ref , 并对其依赖项跟踪和更新触发进行逻辑控制。

在原生 ref 的基础上,添加自己的逻辑等...

Vue 3 中,customRef 是一个用于创建自定义响应式引用的 API。它允许开发者控制和优化响应式引用的行为,适用于特定的需求,例如创建延迟更新、合并多个变更,或是使用非标准的 getter/setter 行为。

customRef 接收一个函数,该函数返回一个对象,这个对象包含 get 和 set 函数。在 get 函数中,可以定义如何返回当前值,而在 set 函数中定义如何更新值。

基本结构:

import { customRef } from 'vue';// 使用 customRef 创建自定义引用
const myRef = customRef((track, trigger) => {let value; // 自定义值return {get() {track(); // 追踪依赖return value; // 返回当前值},set(newValue) {value = newValue; // 设置新值trigger(); // 触发更新},};
});
  • track():用于追踪访问的地方。当调用 get() 时,此函数会注册当前的依赖关系。
  • trigger():用于在调用 set() 时通知依赖于这个引用的地方要重新渲染或执行相应的操作。

实例:封装成 Hooks

// Person.vue<template><div class="person"><h3>{{ msg }}</h3><input type="text" v-model="msg"></div></template><script setup lang='ts' >
// import { ref } from 'vue';
import useMsgRef from '../hooks/useMsgRef'// 使用 Vue 提供的默认 ref 定义响应式数据,数据一变,页面就更新
// const msg = ref('你好')// 使用 Vue 提供的 customRef 定义响应式数据
// 补充需求,输入一秒后,再显示
// 使用 useMsgRef 来定义一个响应式数据且有延迟效果
let {msg}=useMsgRef('xxx',2000)
</script>
<style scoped></style>
// useMsgRef.tsimport { customRef } from "vue";export default function (initValue:String,delay:number) {
// 使用 Vue 提供的 customRef 定义响应式数据
// 初始值
let timer:number
// track(跟踪),trigger(触发)
const msg = customRef((track,trigger) => {return {// get(): msg 被读取时被调用get() {// track() 告诉 Vue 数据 msg 很重要,你要对 msg 进行持续关注// 那么,一旦 msg 变化就去更新track() // console.log('get');return initValue},// set(): msg 被修改时被调用set(value) {// 补充需求,输入一秒后,再显示clearTimeout(timer)timer = setTimeout(() => {console.log('set',value);initValue = value;// trigger() 通知 Vue 数据 msg 变化了trigger()},delay)}}
})return {msg}
}

重点理解:track( ) 和 trigger( )

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

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

相关文章

数字化转型:概念性名词浅谈(第四讲)

​大家好&#xff0c;本篇文章是在新年之际写的&#xff0c;所以在这里先给大家拜个年。 今天要介绍的名词为ETL: ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transfor…

UE学习日志#22 C++笔记#8 基础复习8 string和string_view2

1 std::string_view类 string_view基本上就是const string&的简单替代品&#xff0c;但不会产生开销。他不复制字符串。 string_view添加了remove_prefix(size_t)和remove_suffix(size_t)方法&#xff0c;前者将起始指针给定的偏移量来收缩字符串&#xff0c;后者则将结尾指…

UVM factory机制

目录 1. factory-register 1.1 uvm_object_registry#(type T=uvm_object, string Tname="") 1.1 uvm_default_factory::register 2. factory-override 2.1 set_type_override(uvm_object_wrapper override_type) 2.2 set_inst_override(uvm_object_wrapper ove…

Spring MVC学习——发送请求(@RequestMapping注解及请求参数绑定)

前言 Spring MVC作为Spring框架中的核心组件之一&#xff0c;其强大的功能在于能简洁高效地处理HTTP请求和响应。在开发Web应用时&#xff0c;理解和正确使用Spring MVC的注解&#xff0c;尤其是RequestMapping注解&#xff0c;至关重要。本文将详细讲解RequestMapping注解的使…

C# Action和 Func的用法

C#中的数据类型 函数数据类型 Action 是一个数据类型 但是是没有返回值得函数数据类型 Func 用于指定一个有返回值的委托 internal class Program{static void Main(string[] args){TT.F1(NoVoid);TT.F2(Void1);Void2(() > { Console.WriteLine("Void2执行了");…

C++中的模板(上)

C中的模板(上) 模板参数和函数参数是很像的,函数参数定义的形参对象,而模板参数定义的是类型. 模板分为函数模板和类模板 函数模板 一个交换两个数的函数模板: template<class T> // 此处typename和class是等价的 void Swap(T &a, T &b) {T temp a;a b;b …

MySQL面试题----如何进行 MySQL 数据库备份与恢复

MySQL 数据库备份 1. 使用 mysqldump 工具(逻辑备份) 全量数据库备份 该方式会备份指定数据库中的所有数据和表结构。在命令行中输入以下命令,将 username 替换为你的 MySQL 用户名,password 替换为对应的密码,database_name 替换为要备份的数据库名,backup.sql 为备份文…

Java集合面试总结(题目来源JavaGuide)

问题1&#xff1a;说说 List,Set,Map 三者的区别&#xff1f; 在 Java 中&#xff0c;List、Set 和 Map 是最常用的集合框架&#xff08;Collection Framework&#xff09;接口&#xff0c;它们的主要区别如下&#xff1a; 1. List&#xff08;列表&#xff09; 特点&#xf…

deepseek接入pycharm 进行AI编程

要将DeepSeek接入PyCharm进行AI编程,可以按照以下步骤操作: ### 1. 获取DeepSeek API访问权限 DeepSeek通常以API的形式对外提供服务,你需要在其官方网站注册账号,申请API访问权限。在申请通过后,会获得API密钥(API Key),这是后续调用API的关键凭证。 ### 2. 安装必要…

奥迪改名风波再起,A6L能否率队创下新奇迹

文/王俣祺 导语&#xff1a;春节假期刚过&#xff0c;奥迪的车型命名规则又变了。在如今以内卷为主基调的环境下&#xff0c;车型改名可不是小事&#xff0c;而奥迪的这次调整背后藏着许多深意&#xff0c;也预示着2025年奥迪在产品布局上的新动向。 改名能否“改命” 回溯到…

【怎么用系列】短视频戒除-1-对推荐算法进行干扰

如今推荐算法已经渗透到人们生活的方方面面&#xff0c;尤其是抖音等短视频核心就是推荐算法。 【短视频的危害】 1> 会让人变笨&#xff0c;慢慢让人丧失注意力与专注力 2> 让人丧失阅读长文的能力 3> 让人沉浸在一个又一个快感与嗨点当中。当我们刷短视频时&#x…

改进Transformer,解读Tokenformer论文:基于参数分词化重新思考Transformer的扩展策略

Transformer 训练成本高昂的问题日益凸显&#xff0c;不仅需要耗费巨额的资金与大量的计算资源&#xff0c;还对环境产生了不可忽视的影响&#xff0c;最近由北京大学与谷歌联合发表的一篇论文&#xff0c;为这一棘手难题带来了全新的曙光。论文中提出的创新方案&#xff0c;有…

【STM32】HAL库USB虚拟U盘MSC配置及采用自带的Flash作为文件系统

【STM32】HAL库USB虚拟U盘MSC实现配置及采用自带的Flash作为文件系统 本文将自带的Flash作为文件系统 通过配置USB的MSC功能实现虚拟U盘 没有单独建立FATFS文件系统 仅仅是配置USB和Flash读写而已 当然 这里也可以用外部Flash等等 也可以配置文件系统来进行套壳 但总体而言不如…

Noise Conditional Score Network

NCSN p σ ( x ~ ∣ x ) : N ( x ~ ; x , σ 2 I ) p_\sigma(\tilde{\mathrm{x}}|\mathrm{x}) : \mathcal{N}(\tilde{\mathrm{x}}; \mathrm{x}, \sigma^2\mathbf{I}) pσ​(x~∣x):N(x~;x,σ2I) p σ ( x ~ ) : ∫ p d a t a ( x ) p σ ( x ~ ∣ x ) d x p_\sigma(\mathrm…

jdk8 G1收集器怎么手动调优

在 JDK 8 中&#xff0c;手动调优 G1 垃圾收集器可以通过以下步骤和参数进行&#xff1a; 1. 启用 G1 垃圾收集器 要启用 G1 垃圾收集器&#xff0c;需要在 JVM 启动参数中添加以下选项&#xff1a; -XX:UseG1GC 这个参数告诉 JVM 使用 G1 作为垃圾收集器。 2. 设置堆内存…

Nginx通过设置自定义标记识别代理调用

Nginx通过设置自定义标记识别代理调用 业务场景 最近遇到一个业务场景&#xff0c;部署在云端服务器的一个平台&#xff0c;接口提供给多个现场调用&#xff0c;其中一个现场是通过nginx代理服务器代理转发到云服务器&#xff0c;另外一个现场则是直接通过云服务器接口进行调…

前端知识速记:POST和GET

前端知识速记&#xff1a;POST和GET请求的区别 一、GET请求概述 GET请求是一种用于获取服务器资源的请求方式。**使用GET请求时&#xff0c;数据通过URL传递&#xff0c;适合用于获取数据而不修改资源。**以下是GET请求的一些基本特征&#xff1a; 数据附在URL后面&#xff…

axios如何利用promise无痛刷新token

目录 需求 需求解析 实现思路 方法一&#xff1a; 方法二&#xff1a; 两种方法对比 实现 封装axios基本骨架 instance.interceptors.response.use拦截实现 问题和优化 如何防止多次刷新token 同时发起两个或以上的请求时&#xff0c;其他接口如何重试 最后完整代…

【DeepSeek系列】01 DeepSeek-V1 快速入门

1、DeepSeek简介 2024年底&#xff0c;DeepSeek 相继推出了其第一代推理大模型&#xff1a;DeepSeek-R1-Zero 和 DeepSeek-R1。 DeepSeek-R1-Zero 是一个通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;训练过程中没有使用监督微调&#xff08;SFT&…

基于LabVIEW的Modbus-RTU设备通信失败问题分析与解决

在使用 LabVIEW 通过 Modbus-RTU 协议与工业设备进行通信时&#xff0c;可能遇到无法正常发送或接收指令的问题。常见原因包括协议参数配置错误、硬件连接问题、数据帧格式不正确等。本文以某 RGBW 控制器调光失败为例&#xff0c;提出了一种通用的排查思路&#xff0c;帮助开发…