vue3 响应式API customRef()

news2024/9/25 23:21:45

使用ref()定义响应式数据:

<template>
  <div>
    <div>{{ inputValue }}</div>
    <input type="text" v-model="inputValue">
  </div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const inputValue = ref('hello')
</script>

使用Vue提供的默认ref()定义响应式数据,当数据发生变化时,Vue 的响应式系统会自动检测到变化,并立即更新相关的页面部分。
在这里插入图片描述



现在,实现如下图所示的需求:当在输入框输入123时,输入结束1秒后,页面才更新。
在这里插入图片描述
<input type="text" v-model="inputValue">将输入框与inputValue进行双向绑定,当用户在输入框中输入数字1input框的数据瞬间就改变了,在页面上用作展示的<div>{{ inputValue }}</div>也就更新了。

使用ref()定义响应式数据,数据变了,页面就会立即更新。它无法实现数据变了,等开发者做个 什么什么需求 再来改变页面渲染。

使用Vue提供的customRef()来实现需求。

customRef()

customRef()创建一个自定义的 ref,显式声明对其依赖追踪和更新触发的控制方式。

类型

function customRef<T>(factory: CustomRefFactory<T>): Ref<T>
type CustomRefFactory<T> = (
  track: () => void,
  trigger: () => void
) => {
  get: () => T
  set: (value: T) => void
}

customRef() 预期接收一个工厂函数作为参数,这个工厂函数接受 tracktrigger 两个函数作为参数,并返回一个带有 getset 方法的对象。

  • 一般来说,track() 应该在 get() 方法中调用,而 trigger() 应该在 set() 中调用。
  • get() 在数据读取时调用,用于返回值。
  • set() 在数据被修改时调用,用于更新值并触发更新。
  • track():用于通知 Vue 的响应式系统,当前数据很重要,要持续跟踪数据,一旦数据发生变化,立即更新
  • trigger():用于通知 Vue 的响应式系统,数据发生了变化。

通过自定义响应式引用,可以控制何时触发依赖追踪(track)和响应式更新(trigger)。这对于实现一些特殊的逻辑或优化性能非常有用。

使用customRef()实现函数防抖

使用customRef()实现需求:当在输入框输入123时,输入结束1秒后,页面才更新。

这个功能其实就是函数防抖。

创建一个防抖ref,只在最近一次 set 调用后的一段固定间隔后再调用:

<template>
  <div>
    <div>{{ inputValue }}</div>
    <input type="text" v-model="inputValue">
  </div>
</template>
<script setup lang="ts">
import { customRef } from 'vue';
// 使用customRef定义响应式数据
let value = 'hello'
let timer:number
// track-跟踪  trigger-触发
const inputValue = customRef((track, trigger) => {
  return {
    // get:数据被读取时调用
    get() {
      track()  // 通知响应式系统正在读取数据,告诉响应式系统数据很重要,要对数据保持持续跟踪,一旦数据发生变化,就更新
      return value
    },
    // set:数据被修改时调用
    set(newValue) {
      if(timer){
        clearTimeout(timer)
      }
      timer = setTimeout(() => {
        value = newValue
        trigger()  // 通知响应式系统数据已发生变化
      }, 1000) 
    }
  }
})
</script>

把这个方法封装成一个hooks:

import { customRef } from 'vue';

export default function useDataRef(initValue: string, delayTime: number) {
  let value = initValue
  let timer: number

  return customRef((track, trigger) => {
    return {
      // get:数据被读取时调用
      get() {
        track()  // 通知响应式系统正在读取数据,告诉响应式系统数据很重要,要对数据保持持续跟踪,一旦数据发生变化,就更新
        return value
      },
      // set:数据被修改时调用
      set(newValue) {
        if (timer) {
          clearTimeout(timer)
        }
        timer = setTimeout(() => {
          value = newValue
          trigger()  // 通知响应式系统数据已发生变化
        }, delayTime)
      }
    }
  })
}

使用:

<template>
  <div>
    <div>{{ inputValue }}</div>
    <input type="text" v-model="inputValue">
  </div>
</template>
<script setup lang="ts">
import useDataRef from '@/hooks/useDataRef'
const inputValue = useDataRef('hello', 2000)
</script>

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

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

相关文章

测测万用表?合宙功耗分析仪Air9000Air9000P齐出动

当心&#xff01;那个被你遗忘的万用表&#xff0c;可能正在偷偷“吃”电&#xff01; 万用表不关是一个常见的错误&#xff0c; 指的是在使用万用表进行测量后&#xff0c;没有关闭或断开电路而直接离开。 这样做可能会导致电池耗尽&#xff0c;影响测量结果&#xff0c;甚…

解决报错 ‘numpy‘ has no attribute ‘bool8‘. Did you mean: ‘bool‘?

定位到报错的文件中 将所有bool8都修改为bool_ 一开始按照错误信息提示修改源码为bool还是会显示错误 这是因为&#xff1a; 目前最新的的NumPy版本版本中布尔类型的接口已经改为bool_。 通过查找可以定位到所有错误使用了bool8的位置&#xff08;上图是我修改之后再次查询…

什么是CPU、GPU、NPU?(包懂+会)

目录 举例子 CPU&#xff1a;主厨 GPU&#xff1a;大量的厨房助理 NPU&#xff1a;面包机 总结 讲理论 CPU&#xff08;中央处理器&#xff09; GPU&#xff08;图形处理单元&#xff09; NPU&#xff08;神经网络处理单元&#xff09; 对比分析 举例子 CPU&#xff…

【CAPL实战】解决调用LIN函数不生效问题

测试背景&#xff1a; 被测样件为LIN节点&#xff0c;进行LIN唤醒测试。添加LDF文件后&#xff0c;在vTESTstudio中编写CAPL自动化脚本通过调用LINwakeup()函数来实现唤醒测试。测试结果是唤醒不成功&#xff0c;通过示波器观测发现并没有唤醒脉冲发出&#xff0c;也就是说调用…

JVM基础概念

一、JVM概述 1. 为什么要学习JVM&#xff1f; 线上系统突然宕机&#xff0c;系统⽆法访问&#xff0c;甚⾄直接 OOM &#xff1b; 线上系统响应速度太慢&#xff0c;优化系统性能过程中发现 CPU 占⽤过⾼&#xff0c;原因是因为 JVM 的 GC 次 数过于频繁&#xff1b; 新项⽬…

OJ 最接近的三数之和

题目&#xff1a; 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在恰好一个解。 提示&#xff1a; 3 < nums.length < 1000-1000 < nums[i] < …

【计算机毕设-软件开发类】基于SpringBoot的食品安全管理平台

&#x1f497;博主介绍&#xff1a;✌全平台粉丝5W,高级大厂开发程序员&#x1f603;&#xff0c;博客之星、掘金/知乎/华为云/阿里云等平台优质作者。 【源码获取】关注并且私信我 【联系方式】&#x1f447;&#x1f447;&#x1f447;最下边&#x1f447;&#x1f447;&…

c++188深拷贝和浅拷贝

在全局区字符串 浅拷贝 拷贝指针变量的值而不是内存空间 obj2已经析构了 又进行了一次析构 深拷贝&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;class Name { public:Name(const char* myp){//开辟一个内存把dhfka传入int le…

Java综合实践——学生成绩查询系统

此系列文章收录大量Java经典代码题&#xff08;也可以算是leetcode刷题指南&#xff09;&#xff0c;剩余文章指路Java题集。希望可以与大家一起探索Java的神秘。3、2、1&#xff0c;请看&#xff01; 本篇文章将带大家一起来写一个学生成绩查询系统。 目录 系统呈现效果 前…

亚马逊跨境蓝海选品思路和方法(实操建议版)

跨境电商中&#xff0c;“七分靠选品&#xff0c;三分靠运营”。这句话强调了产品在店铺中的重要性&#xff0c;选品的好坏直接影响到后续推广的成败。 如何正确选择产品我们先从思路入手&#xff0c;明确自己的选品思路。以下是几点选品思路的总结和使用店雷达选品的技巧。 …

硅外延片行业分析:未来几年年复合增长率CAGR为5.3%

硅外延晶片是通过在抛光晶片上添加数微米厚的单层碳化硅晶体层制成的。需要精确控制厚度、掺杂&#xff08;载流子浓度&#xff09;和缺陷密度&#xff0c;才能使半导体制造设备生产出高产量的功率器件。外延主要是为了增强晶片的功能。近年来&#xff0c;技术已成为制造高集成…

集运企业运营过程中有哪些痛点?集运系统如何解决?

在集运行业的激烈竞争中&#xff0c;企业面临着诸多运营痛点&#xff0c;这些痛点不仅影响了企业的运营效率&#xff0c;也制约了客户体验的提升。 易境通集运系统&#xff0c;作为一款专为集运行业设计的智能化管理系统&#xff0c;通过技术创新和流程优化&#xff0c;为集运…

ARMxy嵌入式边缘计算控制器支持Linux OS应用于AIOT

人工智能与物联网&#xff08;AIoT&#xff09;的融合正深刻改变着各个行业。而在这一变革中&#xff0c;ARMxy 嵌入式控制器以其卓越的性能和对 Linux OS 的支持&#xff0c;成为了 AIoT 应用的关键推动力量。 一、ARMxy 嵌入式控制器的优势 强大的处理能力 ARMxy 嵌入式控制…

会话好友区设计与开发(二)

会话好友区设计与开发&#xff08;二&#xff09; 前言 在上一集我们已经完成了对item的设计与开发&#xff0c;也详细解释了一些细节&#xff0c;但是我们上一集并没有对item进行显示&#xff0c;那么这一集我们会开发两个SessionFriendArea的方法以及使用一个宏开关进行测试…

《深入理解JAVA虚拟机(第2版)》- 第11章 - 学习笔记

第11章 晚期&#xff08;运行期&#xff09;优化 11.1 概述 频繁执行的方法或代码块&#xff0c;被认定为“热点代码”&#xff08;Hot Spot Code&#xff09;。为了提高热点代码的执行效率&#xff0c;在运行期&#xff0c;将热点代码编译成本地机器码并进行优化&#xff0c…

VD1012 单节锂离子充电电池保护IC 2.8V过放电压 SOT-353小封装芯片

VD1012内置高精度电压检测电路和延迟电路以及内置MOSFET&#xff0c;是用于单节锂离子/锂聚合物可再充电电池的保护IC。 本IC适合于对1节锂离子/锂聚合物可再充电电池的过充电、过放电和过电流进行保护。 VD1012具备如下特点:高精度电压检测电路 过充电检测电压 4.…

曝字节 AI 硬件团队首款自研产品为智能耳机,与豆包联动;OpenAI 神秘新模型或将在两周内发布丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

「OC」事件点击demo合集

「OC」事件点击demo合集 文章目录 「OC」事件点击demo合集前言可用鼠标移动的UIview突出的tabBar按钮扩大按钮的响应范围 前言 在前面通过学习事件响应流程&#xff0c;学习了许多新的内容&#xff0c;当然也学习了许多不同的用法&#xff0c;但在之前的文章之中并没有将运用到…

SDH信号的帧结构与复用

在OTN技术的学习中&#xff0c;涉及到了大量SDH的相关知识&#xff0c;例如映射&#xff0c;复用&#xff0c;开销等&#xff0c;所以简单的总结一下SDH的帧结构与复用用以辅助学习OTN技术。 DWDM&#xff08;密波&#xff09;大容量SDH&#xff08;同步数字体系&#xff09;的…

无源晶振的等效电路与电路结构解析

无源晶振&#xff0c;即不带内置振荡电路的晶体振荡器&#xff0c;它在电子设备中扮演着产生原始时钟频率的重要角色。以下是关于无源晶振的等效电路、电路结构及其关键参数的详细解析。 一、无源晶振的等效电路 无源晶振的等效电路主要包括静态电容C0、动态电容C1、谐振电阻R…