指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
关于vue3的reactive和ref的区别

在 Vue 3 中,reactive 和 ref 是响应式系统的核心工具,但它们有一些重要的区别,下面详细解释:


1. ref 是用于 基本类型(也可以用于对象)
import { ref } from 'vue';

const count = ref(0);

console.log(count.value); // 0

count.value++; // 修改响应式值

//模板中使用
<template>
  <div>{{ count }}</div>
</template>

  • ref 的特点:

    • ref(0) 创建的是一个响应式包装对象:{ value: 0 }
    • 访问和修改值要通过 .value
    • 在模板中使用时,Vue 会自动解包 .value,可以直接用 {{ count }}

适合用于 字符串、数字、布尔值、null、undefined 等基本类型。


2. reactive 是用于 对象、数组、Map 等引用类型
import { reactive } from 'vue';

const state = reactive({
  count: 0,
  name: 'Vue3'
});

console.log(state.count); // 0

state.count++; // 响应式更新

//模板中使用
<template>
  <div>{{ state.count }}</div>
</template>
  • reactive 的特点:

    • 返回的是原始对象的 Proxy 代理
    • 可以直接读写属性,无需 .value
    • 只能用于对象(不能传基本类型,如 reactive(1) 会警告)

3. 对比总结
特性refreactive
类型支持基本类型和引用类型只支持引用类型
解包方式.value(模板中自动解包)直接访问属性
内部结构{ value: xxx }代理原对象
使用场景单个值、基本类型结构化对象(如 state、form)
响应性兼容在数组、对象中使用需解包自身是响应式

4. 混合使用
const state = reactive({
  count: ref(0), // ref 嵌套在 reactive 中
});

console.log(state.count.value); // 访问 ref 内部的值

state.count.value++; // 修改 ref 值

但推荐在组合式 API 中:

  • 基本值使用 ref
  • 对象用 reactive
  • 不要将 ref 包在 reactive 里(嵌套 .value 可能会让代码变复杂)

5. 实用建议

如果你不确定用哪个,可以参考这个经验法则:

  • 你要声明的是 一个独立变量(数字、字符串等) → 用 ref
  • 你要声明的是 一个结构化状态对象(例如表单、用户信息等) → 用 reactive