vue3 ref 和reactive有什么区别

Vue3 中 ref 和 reactive 的区别

核心区别

特性refreactive
适用数据类型基本类型和对象仅对象
访问方式需要通过 .value 访问直接访问
模板中使用自动解包(无需.value)直接使用
重新赋值可以重新赋值整个对象不能替换整个响应式对象
TypeScript支持更好的类型推断嵌套属性类型推断可能复杂

详细解析

1. 基本用法

ref:

javascript

import { ref } from 'vue'

const count = ref(0) // 创建响应式基本值
const user = ref({ name: 'John' }) // 也可以用于对象

// 访问/修改需要.value
console.log(count.value) // 0
count.value++

reactive:

javascript

import { reactive } from 'vue'

const state = reactive({
  count: 0,
  user: { name: 'John' }
})

// 直接访问
console.log(state.count) // 0
state.count++

2. 模板中使用区别

ref (自动解包):

html

<template>
  <div>{{ count }}</div> <!-- 不需要.value -->
</template>

reactive:

html

<template>
  <div>{{ state.count }}</div>
</template>

3. 重新赋值能力

ref 允许替换整个值:

javascript

const user = ref({ name: 'Alice' })
user.value = { name: 'Bob' } // 完全替换 - 可行

reactive 不能替换整个对象:

javascript

const state = reactive({ count: 0 })
state = { count: 1 } // 错误!会失去响应性

4. 解构行为

ref 解构后仍保持响应性:

javascript

const count = ref(0)
const { value } = count // 仍然响应式

reactive 解构会失去响应性:

javascript

const state = reactive({ count: 0 })
const { count } = state // 失去响应性!

使用场景建议

使用 ref 当:

  • 需要响应式基本类型(数字、字符串等)

  • 需要重新分配整个对象引用

  • 需要简单的值传递

使用 reactive 当:

  • 处理一组逻辑相关的状态

  • 不需要重新分配整个对象

  • 想要更简洁的对象访问语法

性能考虑

两者在性能上没有显著差异,选择应基于代码组织需求而非性能。

最佳实践

  1. 在组合式函数中返回多个值时,通常使用 ref 以便解构后仍保持响应性

  2. 对于复杂的状态对象,使用 reactive 可以获得更干净的访问语法

  3. 可以混合使用 - 在 reactive 对象中包含 ref 会自动解包

javascript

const count = ref(0)
const state = reactive({
  count, // 自动解包 - 模板中可以直接state.count
  message: 'Hello'
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leijmdas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值