vue中ref()和reactive()区别小结

 更新时间:2025年07月03日 11:43:31   作者:翻滚吧键盘  
本文主要介绍了vue中ref()和reactive()区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

好的,这是 Vue 3 中 ref()reactive() 这两个核心响应式 API 之间区别的详细解释。

简单来说,它们是创建响应式数据的两种方式,主要区别在于处理的数据类型访问数据的方式

核心区别速查表

特性ref()reactive()
适用类型✅ 任何类型 (字符串、数字、布尔、对象、数组等)❌ 仅限对象类型 (Object, Array, Map, Set)
访问/修改在 JS 中必须通过 .value 属性在 JS 中直接访问,像普通对象一样
模板中使用不需要 .value,Vue 会自动解包直接访问,像普通对象一样
重新赋值✅ 可以对整个 .value 重新赋值❌ 不能直接对整个变量重新赋值,会破坏响应性
底层原理通过一个包含 value 属性的对象来实现包装使用 ES6 的 Proxy 实现对整个对象的劫持

ref():更灵活的“盒子”

ref() 的设计初衷是为了处理原始数据类型(Primitive Types),如字符串、数字、布尔值。当然,它也可以用来包装对象。

你可以把 ref() 想象成一个万能的、响应式的“盒子”。无论你放什么进去,它都会把它装进一个特殊的盒子里。要访问或修改里面的东西,你需要打开这个盒子,也就是访问它的 .value 属性。

ref()的关键点:

  • 接受任何值:ref('some string'), ref(123), ref(true), ref({ name: '张三' }) 都可以。
  • JS 中必须用 .value:在 <script setup> 或 setup() 函数中,访问和修改 ref 创建的变量时,必须通过 .value。
  • 模板中自动解包:在 <template> 中使用时,Vue 非常智能,会自动“打开盒子”,所以你不需要写 .value。

ref()示例代码:

<template>
  <div>
    <p>计数: {{ count }}</p>
    <button @click="increment">增加</button>

    <p>用户信息: {{ user.name }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';

// 1. 用于原始类型
const count = ref(0);

// 2. 在 JS/TS 中,必须通过 .value 来访问和修改
function increment() {
  count.value++;
}

// 3. 也可以用于对象,但同样需要 .value
const user = ref({ name: '张三' });
console.log(user.value.name); // 输出: 张三
</script>

reactive():对象的“代理”

reactive() 专门用于将对象类型(包括普通对象、数组、Map、Set)的数据转换成响应式数据。

它不做任何包装,而是直接返回一个原始对象的“代理” (Proxy)。你对这个代理对象的所有操作(读取、修改、添加、删除属性)都会被 Vue 拦截,从而触发视图更新。

reactive()的关键点:

  • 只能用于对象:reactive({ ... }), reactive([ ... ]) 可以,但 reactive(123) 会报错。
  • 直接访问:使用起来和普通 JS 对象一模一样,不需要 .value。
  • 不能重新赋值:这是一个非常重要的陷阱!你不能直接用一个新的对象替换整个 reactive 变量,否则会失去响应性,因为这切断了原始代理对象的连接。

reactive()示例代码:

<template>
  <div>
    <p>用户信息: {{ state.user.name }} - {{ state.user.age }} 岁</p>
    <p>他的爱好: {{ state.hobbies.join('、') }}</p>
    <button @click="updateUser">更新用户信息</button>
  </div>
</template>

<script setup>
import { reactive } from 'vue';

// 1. 只能用于对象或数组
const state = reactive({
  user: {
    name: '李四',
    age: 30
  },
  hobbies: ['编程', '音乐']
});

function updateUser() {
  // 2. 直接修改属性,像普通对象一样
  state.user.age++;
  state.hobbies.push('运动');

  // ❌ 错误做法:直接替换整个对象会导致响应性丢失!
  // state = { user: { name: '王五', age: 40 }, hobbies: [] }; 

  // ✅ 正确做法:逐个属性赋值或使用 Object.assign
  // Object.assign(state, { user: { name: '王五', age: 40 }, hobbies: [] });
}
</script>

总结与使用建议

优先使用 ref():

  • 当你需要处理原始数据类型(字符串、数字、布尔值)时,必须使用 ref()。
  • 当你不确定数据类型时,ref() 是更安全、更通用的选择。
  • 社区中有一种流行的风格是“始终使用 ref()”,以保持代码风格的一致性。因为 ref() 既能处理原始类型,也能处理对象。

在特定场景下使用 reactive():

  • 当你明确知道你需要一个复杂的、多层级的响应式对象或数组时,使用 reactive() 可以让代码更简洁,因为你不需要到处写 .value。例如,管理一个复杂的表单状态。

一个简单的记忆法则:

  • ref -> 凡事用它准没错,就是记得在 JS 里加 .value。
  • reactive -> 专为对象服务,用法自然,但小心别整个替换掉它。

到此这篇关于vue中ref()和reactive()区别小结的文章就介绍到这了,更多相关vue ref()和reactive()区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Vue3使用JSX的方法实例(笔记自用)

    Vue3使用JSX的方法实例(笔记自用)

    以前我们经常在react中使用jsx,现在我们在vue中也是用jsx,下面这篇文章主要给大家介绍了关于Vue3使用JSX的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 如何测量vue应用运行时的性能

    如何测量vue应用运行时的性能

    这篇文章主要介绍了如何测量vue应用运行时的性能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • el-tree文字显示不全的解决办法

    el-tree文字显示不全的解决办法

    本文主要介绍了el-tree文字显示不全的解决办法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 在 Vue 中使用 dhtmlxGantt 组件时遇到的问题汇总(推荐)

    在 Vue 中使用 dhtmlxGantt 组件时遇到的问题汇总(推荐)

    dhtmlxGantt一个功能丰富的甘特图插件,支持任务编辑,资源分配和多种视图模式,这篇文章主要介绍了在 Vue 中使用 dhtmlxGantt 组件时遇到的问题汇总,需要的朋友可以参考下
    2023-03-03
  • 对vue中v-on绑定自定事件的实例讲解

    对vue中v-on绑定自定事件的实例讲解

    今天小编就为大家分享一篇对vue中v-on绑定自定事件的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • 关于Vue ui 的没反应、报错问题解决总结

    关于Vue ui 的没反应、报错问题解决总结

    这篇文章主要介绍了关于Vue ui 的没反应、报错问题解决总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • vue实现虚拟列表功能的代码

    vue实现虚拟列表功能的代码

    这篇文章主要介绍了vue实现虚拟列表,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Vue3在Setup中使用axios请求获取的值方式

    Vue3在Setup中使用axios请求获取的值方式

    这篇文章主要介绍了Vue3在Setup中使用axios请求获取的值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • vue的h5日历组件实现详解

    vue的h5日历组件实现详解

    这篇文章主要为大家详细介绍了vue的h5日历组件使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • vue3 ts编写echart是tooltip无法展示的解决

    vue3 ts编写echart是tooltip无法展示的解决

    这篇文章主要介绍了vue3 ts编写echart是tooltip无法展示的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10

最新评论