Vue3 响应式 API:工具函数(一)

isRef()

isRef 是一个简单的工具函数,它接受一个参数并返回一个布尔值,指示该参数是否是一个由 ref 创建的响应式引用。
在某些情况下,你可能需要编写一些通用逻辑或函数,这些逻辑或函数需要处理不同类型的响应式数据(如 ref 和 reactive 创建的数据)。

import { isRef, reactive, ref } from 'vue';  function getValue(data) {  if (isRef(data)) {  return data.value;  } else {  // 假设 data 是一个由 reactive 创建的对象,并且我们想要访问其名为 'prop' 的属性  return data.prop;  }  
}  
const count = ref(0);  
const obj = reactive({ prop: 'Hello' });   
console.log(getValue(count)); // 输出: 0  
console.log(getValue(obj)); // 输出: 'Hello'

unref()

  1. 如果参数是 ref,则返回内部值,否则返回参数本身。这是 val = isRef(val) ? val.value : val 计算的一个语法糖。
  2. unref 的主要作用是简化从 ref 或非 ref 值中获取实际值的逻辑。如果传递给 unref 的是一个 ref,则 unref 返回其 value 属性;如果传递的是一个非 ref 值(如原始值或对象),则直接返回该值。
  3. 当你编写需要处理可能来自不同来源(如 ref 或直接值)的响应式数据的组件或函数时,unref 非常有用。使用 unref 可以确保你始终处理的是实际的值,而不是 ref 对象本身。
import { ref, unref } from 'vue';  // 创建一个 ref  
const count = ref(0);  // 使用 unref  
const countValue = unref(count); // countValue 现在是 0,而不是 ref 对象  // 如果传递一个非 ref 值给 unref  
const nonRefValue = 'Hello, Vue!';  
const result = unref(nonRefValue); // result 现在是 'Hello, Vue!',没有变化

toRef()

  1. toRef 的主要作用是将一个响应式对象中的属性转换为一个响应式引用。这个新的 ref 将与原始对象中的属性保持响应式关联,即当原始属性发生变化时,ref 的值也会自动更新,反之亦然。
  2. 使用 toRef 的主要场景是在你需要将一个响应式对象中的属性作为独立的响应式引用传递或存储时。这在你想要保持原始对象完整性的同时,又想要以更灵活的方式操作其属性时特别有用。
  3. 你可能有一个组件,该组件接收一个响应式对象作为 prop,但你需要将对象中的某个属性作为独立的响应式引用来传递给子组件。在这种情况下,你可以使用 toRef 来创建这个独立的引用,并将其传递给子组件。这样,子组件就可以独立地监听和更新这个属性的值,而不会影响到原始对象的其他属性。
import { reactive, toRef } from 'vue';  // 使用 reactive 创建一个响应式对象  
const state = reactive({  count: 0,  name: 'Vue 3'  
});  // 使用 toRef 创建一个响应式引用,该引用与 state.count 保持响应式关联  
const countRef = toRef(state, 'count');  // 现在,你可以像使用普通的 ref 一样使用 countRef  
console.log(countRef.value); // 输出: 0  // 修改 countRef 的值也会更新 state.count  
countRef.value++;  
console.log(state.count); // 输出: 1  // 同样地,修改 state.count 也会更新 countRef 的值  
state.count++;  
console.log(countRef.value); // 输出: 2

toValue()

  • 使用 toValue(或 unref)的主要目的是确保无论传入的值是 ref 还是非 ref,你都能获取到其实际的值。这在处理可能来自不同来源(如用户输入、组件属性、Vuex 状态等)的响应式数据时非常有用。
function toValue(val) {  return isRef(val) ? val.value : val;  
}  // 使用假设的 toValue 函数  
const count = ref(0);  
const nonRefValue = 'Hello, Vue!';  console.log(toValue(count)); // 输出: 0  
console.log(toValue(nonRefValue)); // 输出: 'Hello, Vue!'

toRefs()

  • toRefs 的主要作用是将一个由 reactive 创建的响应式对象的所有属性转化为响应式的 ref 对象,并返回一个包含这些 ref 对象的普通对象。这样做的好处是,在组件的模板中可以直接使用这些属性,而无需担心它们是 ref 还是普通的值。
  • 使用 toRefs 的主要原因是它提供了一种方便的方式来在组件模板中直接使用响应式对象的属性,而无需在每次访问属性时都添加 .value。
  • toRefs 还允许你保持对原始响应式对象的引用,这样你就可以在 setup 函数内部继续操作该对象,而无需担心会影响到模板中的绑定。
import { reactive, toRefs } from 'vue';  export default {  setup() {  const state = reactive({  count: 0,  name: 'Vue 3'  });  // 使用 toRefs 将 state 的属性转换为 ref 对象  const { count, name } = toRefs(state);  // 可以在 setup 函数中继续操作 state 或 count/name  function increment() {  state.count++; // 或者 count.value++  }  return {  count, // 这里返回的是 ref 对象,但在模板中可以直接使用 count 而不是 count.value  name,  // 同理  increment  };  }  
};

isReactive()

  • isReactive 函数接受一个参数,该参数是你想要检查的对象。如果对象是由 reactive 函数创建的,那么 isReactive 将返回 true;否则,它将返回 false。
  • 使用 isReactive 的主要目的是在开发过程中验证一个对象是否已经被转换为响应式对象。这在你需要确保某个对象是否可以被 Vue 的响应式系统追踪其变化时特别有用。
import { reactive, isReactive } from 'vue';  // 创建一个响应式对象  
const reactiveObj = reactive({  name: 'Vue 3',  version: '3.x'  
});  // 使用 isReactive 检查对象是否响应式  
console.log(isReactive(reactiveObj)); // 输出: true  // 创建一个非响应式对象  
const nonReactiveObj = {  message: 'Hello, Vue!'  
};  // 使用 isReactive 检查对象是否响应式  
console.log(isReactive(nonReactiveObj)); // 输出: false

isReadonly()

  • isReadonly 函数接受一个参数,即你想要检查的对象。如果对象是由 readonly 函数创建的,那么 isReadonly 将返回 true;否则,它将返回 false。
  • 只读对象是一种特殊的响应式对象,其属性是只读的,也就是说,尝试修改只读对象的属性将会失败,并且不会触发视图更新。
  • 使用 isReadonly 的主要目的是在开发过程中验证一个对象是否已经被转换为只读对象。这在以下场景中特别有用:
  1. 保护状态:当你想要暴露一些状态给外部使用,但又不想让这些状态被意外修改时,可以使用 readonly 创建只读对象,并使用 isReadonly 验证其只读性。
  2. 组件间通信:在组件间通过 props 传递数据时,有时你可能希望传递的数据是只读的,以确保子组件不会修改父组件的状态。这时,你可以在父组件中使用 readonly 创建只读对象,并在子组件中使用 isReadonly 验证其只读性。
  3. 调试和测试:isReadonly 可以用于调试和测试过程中,帮助你验证对象是否按预期被设置为只读。
import { reactive, readonly, isReadonly } from 'vue';  // 创建一个响应式对象  
const reactiveObj = reactive({  name: 'Vue 3',  version: '3.x'  
});  // 创建一个只读对象  
const readonlyObj = readonly(reactiveObj);  // 使用 isReadonly 检查对象是否只读  
console.log(isReadonly(readonlyObj)); // 输出: true  
console.log(isReadonly(reactiveObj)); // 输出: false  
// 尝试修改只读对象  
readonlyObj.name = 'Cannot change'; // 不会生效,且不会触发任何警告或错误
//只读对象,想暴露给外部使用,但希望可读,这里就不写暴露代码了....

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

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

相关文章

C++STL---stack queue模拟实现

前言 对于这两个容器适配器的模拟实现非常简单,因为stack和queue只是对其他容器的接口进行了包装,在STL中,若我们不指明用哪种容器作为底层实现,栈和队列都默认是又deque作为底层实现的。 也就是说,stack和queue不管是…

React@16.x(22)HOOK,useState 的原理

目录 1,介绍2,useState2.1,使用2.2,原理2.3,注意点 1,介绍 1,出现时间点:在 React16.8.0 出现。 2,目的:为了增强函数组件的功能,用于替代类组件…

数据挖掘实战-基于Catboost算法的艾滋病数据可视化与建模分析

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

C++中的sizeof和strlen详解

在C中,sizeof和strlen都是用于获取长度或大小的运算符/函数,但它们的用途和工作方式有所不同。以下是对它们的详细解释: sizeof 运算符 sizeof 是一个编译时运算符,用于计算数据类型或对象的大小(以字节为单位&#…

FANUC机器人SRVO-348 DCS MCC关闭报警处理方法总结

FANUC机器人SRVO-348 DCS MCC关闭报警处理方法总结 如下图所示,由于操作人员在操机时误打开了安全门,导致机器人紧急制动停止,示教器上显示: SRV0-348 DCS MCC关闭报警0,1, 如下图所示,查看手册中关于SRVO-348报警的具体内容: 原因分析:给机器人主电源上电的接触器在紧…

PLS_INTEGER:Oracle PL/SQL中的整数类型深度解析

PLS_INTEGER:Oracle PL/SQL中的整数类型深度解析 一、概述二、PLS_INTEGER简介三、PLS_INTEGER的优点四、PLS_INTEGER的简单示例示例1:声明并使用PLS_INTEGER变量示例2:在存储过程中使用PLS_INTEGER 五、资深应用的代码示例示例3:…

《机器学习特征提取》

书籍:Building Feature Extraction with Machine Learning: Geospatial Applications 作者:Bharath.H. Aithal,Prakash P.S. 出版:CRC Press 书籍下载-《机器学习特征提取》这是一本面向专业人士和研究生的实用指南&#xff0c…

SSM框架整合,内嵌Tomcat。基于注解的方式集成

介绍: SSM相信大家都不陌生,在spring boot出现之前,SSM一直是Java在web开发中的老大哥。现在虽说有了spring boot能自动整合第三方框架了,但是现在市面上任然有很多老项目是基于SSM技术的。因此,能熟练掌握SSM进行开发…

DALL-E2详解

标题: DALL-E2详解 摘要: 本文将详细介绍DALL-E2,OpenAI最新推出的人工智能图像生成模型。DALL-E2在图像生成领域取得了显著进展,它不仅能够生成逼真的图像,还能根据文本描述创造出新颖且具有创意的视觉内容。本文将探…

队列的讲解与实现

这里写目录标题 一、队列的概念及结构二、队列的实现(使用VS2022的C语言)1.初始化、销毁2.入队、出队3.返回队头元素、返回队尾元素、判空、返回有效元素个数 三、完整 Queue.c 源代码 一、队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端…

【Linux】进程(8):Linux真正是如何调度的

大家好,我是苏貝,本篇博客带大家了解Linux进程(8):Linux真正是如何调度的,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 之前我们讲过,在大…

conda虚拟环境如何卸载pip

要在conda虚拟环境中卸载pip,你可以使用conda命令来移除它。以下是具体步骤: 激活你想要移除pip的conda虚拟环境。 使用conda命令移除pip。 下面是具体的命令: bash conda activate your_env_name # 替换your_env_name为你的环境名称 cond…

代码随想录算法训练营第四十九天 | 139.单词拆分、多重背包、背包问题总结

139.单词拆分 视频讲解: 动态规划之完全背包,你的背包如何装满?| LeetCode:139.单词拆分_哔哩哔哩_bilibili 代码随想录 解题思路 1.dp[i] 字符串的长度为i,dp[i]是否可以被组成 2.递推公式 if( [j,i] && d…

硬件IIC和软件IIC的比较

(一)硬件IIC 硬件IIC是由STM32内部的硬件模块实现的,使用CPU的时钟信号来控制数据传输和时序,通信速度较快,可以达到几十MHz的速度。硬件IIC的实现相对简单,无需编写复杂的代码,因此在实现IIC通…

如何理解与学习数学分析——第二部分——数学分析中的基本概念——第5章——序列

第2 部分:数学分析中的基本概念 (Concepts in Analysis) 5. 序列(Sequences) 本章介绍了序列属性,例如单调性、有界性和收敛性,使用图表和示例来解释这些属性,并演示如何在各种证明中使用它们的定义。讨论了趋于无穷大的序列出…

API key学习笔记

API Key 基本上可以认为是一个长字符串,允许 API 消费者(即使用 API 的人)访问受限的功能和数据。它作为一种安全措施,确保了 API 服务能够控制谁有权限访问什么数据,同时也帮助跟踪API的使用情况。生成API key来调用A…

centos官方yum源不可用 解决方案(随手记)

昨天用yum安装软件的时候,就报错了 [rootop01 ~]# yum install -y net-tools CentOS Stream 8 - AppStream 73 B/s | 38 B 00:00 Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlis…

创新指南 | 5个行之有效的初创企业增长策略

本文探讨了五种初创企业实现快速增长的有效策略:利用网络效应通过激励和资本化用户增长;通过持续提供高质量内容建立信任和权威的内容营销;利用简单有效的推荐计划扩展用户群;采用敏捷开发方法快速适应市场变化和客户反馈&#xf…

Codeforces Round 950 (Div. 3) A B C D E

A. Problem Generator time limit per test: 1 second memory limit per test: 256 megabytes input: standard input output: standard output Vlad is planning to hold m m m rounds next month. Each round should contain one problem of difficulty levels ‘A’, ‘B’…

Java:JDK8 GC中ParNew和CMS的问题说明

JDK8中常用如下的垃圾收集器,它们分别运用在年轻代和老年代: ParNew : 年轻代垃圾收集器,多线程,采用标记—复制算法。 CMS:老年代的收集器,全称(Concurrent Mark and Sweep)&#…