vue3中ref()和reactive()的区别

Vue3提供ref()和reactive()来创建响应式数据。reactive()用于深度响应式对象和数组,但对原始类型无效,且不能直接替换响应式对象。ref()则可以响应任何类型,尤其是用于简单数据类型,当传递对象时会自动转为reactive。ref在传递和解构时保持响应性,而reactive在某些操作后会丢失响应性。
摘要由CSDN通过智能技术生成

vue3提供了两种声明响应式数据的方式:ref()和reactive()。

reactive

reactive() 函数用于创建一个响应式对象或数组,返回的是一个原始对象的 Proxy。reactive() API 有两条限制:

  1. 仅对对象类型有效(对象、数组和 Map、Set 这样的集合类型),对 string、number 和 boolean 这样的 原始类型 无效。
  2. 不可以随意地“替换”一个响应式对象,这将导致对初始引用的响应性连接丢失。当我们将响应式对象的属性赋值或解构至本地变量时,或是将该属性传入一个函数时,会失去响应性。
let state = reactive({ count: 0 })
// 上面的引用 ({ count: 0 }) 将不再被追踪(响应性连接已丢失!)
state = reactive({ count: 1 })

// n 是一个局部变量,同 state.count 失去响应性连接
let n = state.count
// 不影响原始的 state
n++

// count 也和 state.count 失去了响应性连接
let { count } = state
// 不会影响原始的 state
count++

// 该函数接收一个普通数字,并且将无法跟踪 state.count 的变化
callSomeFunction(state.count)

ref

ref() 方法用于创建可以使用任何值类型的响应式变量,返回一个基于该值的响应式 ref 对象。ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象,ref 的 .value 属性也是响应式的。同时,当参数的值为对象类型时,会用 reactive() 自动转换它的 .value。

  1. 一个包含对象类型值的 ref 可以响应式地替换整个对象。
const objectRef = ref({ count: 0 })
// 这是响应式的替换
objectRef.value = { count: 1 }
  1. ref 被传递给函数或是从一般对象上被解构时,不会丢失响应性。ref() 让我们能创造一种对任意值的 “引用”,并能够在不丢失响应性的前提下传递这些引用。
const obj = {
  foo: ref(1),
  bar: ref(2)
}

// 该函数接收一个 ref,需要通过 .value 取值,但它会保持响应性
callSomeFunction(obj.foo)

// 仍然是响应式的
const { foo, bar } = obj

总结

reactive() 和 ref() 都是用来定义响应式数据的。reactive()参数一般接受对象或数组,是深层次的响应式。ref()参数一般接收简单数据类型,若ref()接收对象为参数,本质上会转变为reactive方法。ref() 和 reactive() 本质我们可以简单的理解为ref是对reactive的二次包装。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值