vue3响应式数据(ref,reactive)详解

ref

概念:

  • 用于创建响应式的基本类型数据(如 string, number, boolean)

  • 也可以用于对象和数组,但更推荐对基本类型使用

  • 返回一个响应式的、可变的 ref 对象,该对象内部通过 .value 属性持有其值

  • 模板中的 ref 属性(如 <div ref="myDiv">)会创建 DOM 元素的引用,这与响应式的 ref 是不同的概念

javascript 复制代码
import { ref } from 'vue'

const count = ref(0) // 创建
console.log(count.value) // 访问
count.value++ // 修改

特点:

  1. 在模板中使用时自动解包,无需 .value

  2. 在响应式对象中使用时自动解包

    javascript 复制代码
    ​
    const state = reactive({
      foo: 1,
      bar: 2
    })
    
    //直接使用即可,不需要state.foo.value++
    ​state.foo++
    console.log(​state.foo)// 2
  3. 适合用于基本类型数据和需要在多处引用的响应式数据

reactive

概念:

  • 用于创建响应式的对象(包括数组)

  • 返回对象的响应式代理

  • 只能用于对象类型(Object, Array, Map, Set 等)

javascript 复制代码
import { reactive } from 'vue'

const state = reactive({
  count: 0,
  name: 'Vue'
}) // 创建
console.log(state.count) // 访问
state.count++ // 修改

特点:

  1. 直接访问和修改属性,不需要 .value

  2. 解构或属性赋值会失去响应性

  3. 适合用于复杂对象和局部状态

toRef 和 toRefs

toReftoRefs 是 Vue3 组合式 API 中用于处理响应式引用的两个实用函数,它们可以帮助我们在解构或传递响应式对象时保持其响应性。

toRef

toRef 用于为响应式对象上的某个属性创建一个 ref 引用,这个 ref 会与源属性保持同步。

javascript 复制代码
import { reactive, toRef } from 'vue'

const state = reactive({
  foo: 1,
  bar: 2
})

// 创建一个与 state.foo 保持同步的 ref
const fooRef = toRef(state, 'foo')

// 修改 ref 会更新原始属性
fooRef.value++
console.log(state.foo) // 2

// 修改原始属性也会更新 ref
state.foo++
console.log(fooRef.value) // 3

toRefs

toRefs 将一个响应式对象转换为一个普通对象,这个普通对象的每个属性都是指向原始对象相应属性的 ref。

简单理解,如图所示:

javascript 复制代码
import { reactive, toRefs } from 'vue'

const state = reactive({
  foo: 1,
  bar: 2
})

const stateRefs = toRefs(state)

// ref 和原始属性保持同步
stateRefs.foo.value++
console.log(state.foo) // 2

state.bar++
console.log(stateRefs.bar.value) // 3

注意事项:

  1. 这两个函数只对响应式对象(reactive 创建)有效,对普通对象无效

  2. 使用解构赋值时,toRefs 可以保持响应性,而直接解构会失去响应性

  3. 对于可能不存在的属性,可以使用 toRef 并提供默认值:

    javascript 复制代码
    const fooRef = toRef(state, 'nonExistent', 'default value')

实际应用:

  1. 基本类型 优先使用 ref

  2. 复杂对象(层级较深) 使用 reactive

  3. 组合式函数返回状态时优先返回 ref,方便解构

  4. 使用 isRefisReactive 进行类型检查

相关推荐
passerby606118 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了18 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅18 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅18 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅19 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment19 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅19 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊19 小时前
jwt介绍
前端
爱敲代码的小鱼19 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax
吹牛不交税19 小时前
admin.net-v2 框架使用笔记-netcore8.0/10.0版
vue.js·.netcore