【前端】【面试】ref与reactive的区别

embedded/2025/2/12 13:00:21/

refreactive 的区别笔记

一、概述

在 Vue 3 的组合式 API 中,refreactive 是两个非常重要的响应式工具,它们都用于创建响应式数据,但在使用方式、适用场景和内部实现上存在一些区别。

二、基本使用方式

1. ref

ref 用于创建一个响应式的引用对象,它可以接收任何类型的值,包括基本数据类型(如 numberstringboolean 等)和对象类型。通过 .value 属性来访问和修改其值。当传入对象时,ref 内部实际上会使用 reactive 对该对象进行处理以实现响应式。

<template><div><p>{{ person.value.name }}</p><button @click="changeName">Change Name</button></div>
</template><script setup>
import { ref } from 'vue';// 创建一个包含对象的 ref
const person = ref({name: 'John'
});const changeName = () => {// 修改 ref 中对象的属性person.value.name = 'Jane';
};
</script>

2. reactive

reactive 用于创建一个响应式的对象,它只能接收对象类型的值(包括普通对象、数组、Map、Set 等),并且不需要通过 .value 来访问和修改其属性。

<template><div><p>{{ state.name }}</p><button @click="changeName">Change Name</button></div>
</template><script setup>
import { reactive } from 'vue';// 创建一个 reactive 对象
const state = reactive({name: 'John'
});const changeName = () => {// 直接修改 reactive 对象的属性state.name = 'Jane';
};
</script>

三、适用场景

1. ref

  • 基本数据类型:当需要对基本数据类型(如数字、字符串、布尔值)进行响应式处理时,ref 是首选。因为基本数据类型没有属性,无法直接使用 reactive
  • 在模板中使用:在模板中使用 ref 时,Vue 会自动解包 .value,使得使用起来更加方便。
  • 跨组件传递ref 可以方便地在组件之间传递,接收方可以通过 .value 访问和修改其值。
  • 复杂对象:虽然 ref 可用于复杂对象,但使用时要注意通过 .value 来操作对象。当传入对象时,ref 会借助 reactive 让对象具有响应式能力。

2. reactive

  • 对象和数组:当需要对对象或数组进行响应式处理时,reactive 更加合适。它可以递归地将对象的所有属性转换为响应式的。
  • 复杂数据结构:对于包含多个属性的复杂对象,使用 reactive 可以避免为每个属性创建单独的 ref,且使用时无需 .value 这样的额外操作。

四、内部实现区别

1. ref

ref 内部使用了一个 RefImpl 类来包装传入的值,通过 gettersetter 来实现响应式。当传入对象时,会调用 reactive 方法将对象转换为响应式对象。当访问 ref.value 属性时,会触发 getter,收集依赖;当修改 .value 属性时,会触发 setter,通知依赖更新。

2. reactive

reactive 内部使用了 Proxy 对象来拦截对象的属性访问和修改操作。当访问或修改 reactive 对象的属性时,Proxy 会自动收集依赖或通知依赖更新。

五、注意事项

1. ref 在对象中的使用

ref 作为 reactive 对象的属性时,在访问时会自动解包 .value

<script setup>
import { ref, reactive } from 'vue';const count = ref(0);
const state = reactive({count
});// 这里不需要使用 state.count.value
console.log(state.count); 
</script>

2. 响应式丢失问题

reactive 对象在解构赋值后会失去响应式特性,而 ref 不会。

<script setup>
import { reactive } from 'vue';const state = reactive({name: 'John'
});// 解构赋值后,name 失去响应式
const { name } = state; 
</script>

综上所述,refreactive 各有优缺点,在实际开发中需要根据具体的场景选择合适的工具。


http://www.ppmy.cn/embedded/161598.html

相关文章

Redis 集群工作原理? 如何通信?MOVED和ASKED 有什么区别

目录 Redis 集群工作原理 1. 数据分片 2. 节点角色 3. 自动故障转移 Redis 集群通信方式 1. Gossip 协议 2. TCP 通信 MOVED 和 ASK 错误的区别 1. MOVED 错误 2. ASK 错误 Redis 集群工作原理 1. 数据分片 Redis 集群采用哈希槽(Hash Slot)来实现数据的分片存储…

从词袋到Transformer:自然语言处理的演进与实战

自然语言处理(NLP)是人工智能领域中最具挑战性和吸引力的方向之一。从最早的规则系统到如今的深度学习模型,NLP技术的发展历程充满了创新与突破。本文将带你深入探讨NLP的核心技术演进,并通过代码和案例展示如何从简单的词袋模型过渡到强大的Transformer架构。 1. 词袋模型…

浅谈Deepseek MoE

文章目录 Deepseek MoE1. MoE的定义1.1 什么是MoE&#xff08;Mixture of Experts&#xff09;&#xff1f;1.2 传统MoE的架构1.2.1 专家网络&#xff08;Experts&#xff09;1.2.2 门控网络&#xff08;Gating Network&#xff09; 1.3 传统MoE的工作流程1.4 传统MoE的特点1.5…

Linux内核实时机制x - 实时性之中断响应优化

Linux内核实时机制x - 实时性之中断响应优化 在基于PREEMPT_RT的Linux实时系统&#xff0c;社区开发了一套测试工具集rt-test&#xff0c;用于测试实时系统的各种指标。 其中重点关注的指标有&#xff1a; 中断响应时间 Cyclitest信号混洗时间 sigwaittest死锁解除时间 ptsem…

matlab基础

文章目录 数据类型符号表向量、矩阵操作多项式单元数组结构型变量 数据类型 常量&#xff1a; 1. pi #圆周率 2. inf #无穷大 3. NaN #无效值 变量&#xff1a; 1. char #字符型数据&#xff0c;属于整型数据的一种&#xff0c;占用1 个字节。 2. unsigned char #无符…

在 Flutter 实现下拉刷新、上拉加载更多和一键点击回到顶部的功能

在 Flutter 中&#xff0c;实现下拉刷新、上拉加载更多和一键点击回到顶部的功能&#xff0c;通常会结合使用 RefreshIndicator、ListView 和 ScrollController 来实现这些交互效果。下面分别介绍如何实现这些功能。 1. 下拉刷新 Flutter 提供了 RefreshIndicator 组件来实现…

利用maven搭建完web环境后,如何在pom.xml中编写servlet依赖范围配置

步骤一&#xff1a;打开Maven的中央仓库&#xff1a;https://mvnrepository.com/ 步骤二&#xff1a;在搜索框&#xff0c;搜索“Servlet” 步骤三&#xff1a;选择合适的版本&#xff0c;点击跳转到相应页面 这里举例3.1.0版本&#xff0c;一般这个版本与tomcat8匹配。 步骤…

Transformer基础 多头自注意力机制

# 1. **自注意力机制**&#xff1a;Transformer通过自注意力机制能够高效地计算序列内所有元素之间的关系&#xff0c;这使得模型能够捕捉到长距离依赖&#xff0c;无论这些依赖的距离有多远。 # 2. **并行化处理**&#xff1a;与RNN不同&#xff0c;Transformer可以同时处理整…