你可能有疑问,为什么对象类型不能用ref呢?

简介: 你可能有疑问,为什么对象类型不能用ref呢?

reactive对比ref

  • 从定义数据角度对比:
  • ref用来定义:基本类型数据
  • reactive用来定义:对象(或数组)类型数据
  • 备注:ref也可以用来定义对象(或数组)类型数据, 它内部会自动通过reactive转为代理对象


  • 从原理角度对比:
  • ref通过Object.defineProperty()getset来实现响应式(数据劫持)。
  • reactive通过使用Proxy来实现响应式(数据劫持), 并通过Reflect操作源对象内部的数据。


  • 从使用角度对比:
  • ref定义的数据:操作数据需要.value,读取数据时模板中直接读取不需要.value
  • reactive定义的数据:操作数据与读取数据:均不需要.value


你可能有疑问,为什么对象类型不能用ref呢?


使用 ref 函数创建的响应式数据是基于 Vue 3 的 Ref 类型实现的,它主要用于包装基本类型的值,并提供了响应式的访问和更新接口。虽然 ref 可以用于创建对象类型的响应式数据,但并不建议这样做,因为在处理对象类型数据时,ref 的行为与预期可能不一致,而且在某些情况下会导致代码出现问题。


举个例子来说明为什么不建议使用 ref 来创建对象类型的响应式数据:

 import { ref, reactive } from 'vue';
 // 使用 ref 创建基本类型数据
 const count = ref(0);
 // 使用 ref 创建对象类型数据
 const user = ref({ name: 'Alice', age: 25 });
 // 尝试修改对象属性
 user.value.name = 'Bob';
 console.log(user.value); // { name: 'Bob', age: 25 }

这个例子中,我们首先使用 ref 创建了一个基本类型的响应式数据 count,以及一个对象类型的响应式数据 user。然后,我们尝试直接修改 user 对象的属性,结果发现对象的属性修改成功了。


尽管我们使用了 ref 创建了 user 对象,但是 ref 返回的是一个 Ref 对象,而不是一个普通的对象。所以在修改 user 对象时,实际上是在修改 Ref 对象的 value 属性的值,而不是直接修改对象本身。但由于 Vue 3 对 Ref 对象进行了特殊处理,使其可以像普通对象一样使用,因此在这个例子中修改 user 对象的属性看起来是有效的。


然而,这种做法并不是 Vue 3 官方推荐的方式。为了避免出现意料之外的问题,并且保持代码的一致性和可读性,我们应该使用 reactive 函数来创建对象类型的响应式数据,而不是使用 ref哈



相关文章
|
6月前
|
C#
C#系列之ref和out的区别
C#系列之ref和out的区别
200 0
C#基础⑧——方法(函数、重载、out、ref)
比喻成职能。比喻成一个生产自行车老板,一个地方专门放螺丝,一个地方专门放轮,一个地方专门放车链子,需要组装什么就从那个仓库里面拿就行了。各司其职。
|
C++
c++中ref的作用
c++中ref的作用
150 0
|
JSON Java 数据库
代码重构实战-将值对象改为引用对象(Change Value to Reference)
一个数据结构中可能包含多个记录,而这些记录都关联到同一个逻辑数据结构。例如,我可能会读取一系列订单数据,其中有多条订单属于同一个顾客。遇到这样的共享关系,既能将顾客信息作为值对象看待,也能将其视为引用对象
104 0
C# ref out的使用与区别
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。Ref型参数引入前必须赋值。 out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。 Out型参数引入前不需赋值,赋值也没用。
151 0
C# ref out的使用与区别
|
测试技术
Object C学习笔记3-对象的使用和定义
  1. 如何定义一个对象   在面向对象的语言中,定义一个对象是使用Class关键字,而在Object-C中则是使用@interface,@interface用于定义对象的属性和方法,@implementation则用于对象的详细描述。
860 0