vue-响应式变量(ref&&reactive)

之前笔者在学校里的时候,做过一些前端相关的企业级开发项目,但毕竟是学生时代,做的项目破绽百出,主打一个能用就行,什么效率,什么框架优点完全不考虑。直到最近接手了一个公司前辈的项目,对比人家写的代码,再回想起自己写的代码,简直是在用马力来拉火车,主打一个现代+中世纪的魔幻感,其中一部分就是今天我们要讲的主题,vue的特色,响应式变量。

响应式变量主要有ref和reactive两种,ref vue2,3都有,reactive则是vue3才引进的,ref函数会返回一个带有value和.value属性的对象,当你要读取或修改该对象的值时,唯一方法是使用.value属性
for example:

import { ref } from 'vue';

// 创建一个带有初始值0的响应式变量
const count = ref(0);

// 读取count的值
console.log(count.value); // 输出: 0

// 修改count的值
count.value++;
console.log(count.value); // 输出: 1

ref可以定义任意属性的变量,他只代表了该变量是响应式的

相对于ref,reactive用于绑定复杂的数据类型,如数组,对象
所以,reactive访问对象的值时,不像ref一样必须使用.value方法,只需要对象名.属性名的方法即可访问。
such as:

import { reactive } from 'vue';

// 创建一个响应式对象
const state = reactive({
  count: 0,
  name: 'Vue',
  nested: {
    info: 'Nested property'
  }
});

// 访问和修改属性
console.log(state.count); // 输出: 0
state.count++;
console.log(state.count); // 输出: 1

// 修改嵌套对象的属性
state.nested.info = 'Updated nested property';

介绍完了响应式变量,我们来谈谈为什么要使用响应式变量,响应式变量的好处是显而易见的,其能够使数据的变化能够自动反映在用户界面中,而无需手动刷新或更新视图。
回想起我之前写代码的时候,用传统变量,每次操作完就要调用一个手动的刷新函数,一个系统有10来个环节,每个环节结束我都要手动刷新,三个大模块写到后面我人都晕掉了,维护起来更是一团乱麻,牛魔的哪知道哪里要调哪个刷新函数。
而用响应式变量的好处是显而易见的,不用手动刷新,数据修改完页面自动更新。所以我一开始接手这个项目的时候还在找刷新函数在哪呢,找了半天,前辈用的是响应式变量,感谢前辈,维护工作量瞬间小了好多,加个新模块也很快就搞定了。
说起来,也不知道之前写的那个系统还在不在使用,我的锅,把一个复杂的系统搞得更复杂了。。。。。。

### Vue3 中 `ref` 和 `reactive` 的响应式实现原理 #### 一、Vue3 响应式的整体机制 Vue3 使用了一种基于 Proxy 的全新响应式系统,取代了 Vue2 中的 Object.defineProperty 方法。Proxy 提供了一个更强大和灵活的方式来拦截对象的操作行为[^1]。 当通过 `ref` 或 `reactive` 定义一个响应式变量时,Vue3 实际上会利用 JavaScript 的 Proxy 来追踪这些变量的变化,并在变化发生时通知视图更新。 --- #### 二、`ref` 的响应式实现原理 `ref` 是用来定义基本类型的响应式数据的一种方式。它内部实际上是一个包装器,将传入的值存储在一个带有 `.value` 属性的对象中。这样做的目的是为了使该值可以被检测到其变更。 以下是其实现的关键点: - 当调用 `ref(value)` 时,如果传递的是一个对象,则会自动将其转换为 `reactive` 类型;如果是原始类型(如字符串、数字等),则保持不变。 - 在模板或其他地方访问 `ref` 数据时,Vue 自动解包 `.value`,使得开发者无需显式书写 `.value` 即可获取实际值[^3]。 代码示例展示如何使用 `ref` 并观察其工作流程: ```javascript import { ref } from 'vue'; const count = ref(0); // 创建一个 ref 对象 console.log(count.value); // 输出初始值 0 count.value++; // 修改 .value 属性触发响应式更新 console.log(count.value); // 输出修改后的值 1 ``` --- #### 三、`reactive` 的响应式实现原理 `reactive` 主要用于处理复杂的嵌套对象结构。它的核心是通过 Proxy 拦截对对象属性的各种操作(读取、设置、删除等)。具体来说: - 调用 `reactive(obj)` 后返回的新对象是对原对象的一个代理版本。 - 如果尝试访问或更改此代理对象上的任何属性,都会触发相应的 getter 和 setter 钩子函数。 - 这些钩子函数负责记录依赖关系以及后续的通知过程。 下面是一段简单的例子说明 `reactive` 的功能: ```javascript import { reactive } from 'vue'; const state = reactive({ name: 'Alice', age: 25, }); state.age += 1; // 更改年龄属性触发响应式更新 console.log(state.name, state.age); // 打印 Alice 和新的年龄值 ``` 需要注意的一点是,由于 `reactive` 返回的是一个新的代理实例,因此不能直接对其源对象进行赋值或者比较相等问题。 --- #### 四、两者的对比分析 尽管两者都服务于相同的最终目标——建立响应式链接,但在某些方面存在差异: - **适用范围**: - `ref`: 推荐用于简单基础类型的数据声明; - `reactive`: 更适合管理具有多层嵌套特性的复杂状态树。 - **性能开销**: - `ref` 添加额外一层封装 (`.value`) ,可能稍微增加内存消耗; - `reactive` 则直接作用于整个对象层次之上,通常效率更高一些。 总结而言,在选择工具之前应该考虑具体的业务需求和个人偏好等因素再做决定。 --- ### 结论 无论是采用 `ref` 抑或是 `reactive` 方式来构建应用中的动态交互逻辑,背后均依托着强大的 Proxy 技术支持完成高效的双向绑定效果。理解清楚各自的特性有助于我们写出更加优雅简洁且易于维护的应用程序代码[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值