Vue学习笔记集--reactive和ref函数

reactive和ref函数

在 Vue 3 的 Composition API 中,reactive 和 ref 是用于创建响应式数据的两个核心函数。

它们的核心区别在于数据类型处理方式 和使用场景。


ref 和 reactive 的对比

特性 ref reactive
适用数据类型 基本类型(number, string 等) 对象或数组
返回值类型 Ref 对象(含 .value 属性) Proxy 代理的响应式对象
访问值的方式 必须通过 .value 访问 直接访问属性(如 obj.key)
解构响应性 保持响应性(无需额外处理) 直接解构会丢失响应性,需用 toRefs
使用场景 独立的基本类型值、需要传递的响应式变量 复杂对象状态管理

ref 的深度解析

1. 基本用法
javascript 复制代码
import { ref } from 'vue';

const count = ref(0); // 定义响应式数据
console.log(count.value); // 访问值 → 0
count.value = 1; // 修改值 → 触发更新
2. 底层原理
  • ref 将数据包装在一个对象中,通过 .value 属性实现响应式。

  • 即使赋值对象,内部会自动调用 reactive 处理:

    javascript 复制代码
    const objRef = ref({ name: 'Vue' });
    objRef.value.name = 'Vue 3'; // 响应式更新
3. 自动解包(模板中免 .value)

在模板中直接使用 ref 变量时,无需 .value:

vue 复制代码
<template>
  <div>{{ count }}</div> <!-- 自动解包,无需 count.value -->
</template>

reactive 的深度解析

1. 基本用法
javascript 复制代码
import { reactive } from 'vue';

const state = reactive({
  name: 'Vue',
  version: 3,
});
state.name = 'Vue 3'; // 直接修改属性 → 触发更新
2. 底层原理
  • 基于 ES6 的 Proxy 实现,深度代理整个对象。

  • 直接解构会丢失响应性 ,需用 toRefs 转换:

    javascript 复制代码
    const state = reactive({ name: 'Vue' });
    const { name } = toRefs(state); // 转换为 Ref 对象
    console.log(name.value); // 'Vue'(保持响应性)
3. 局限性
  • 不能直接替换整个对象(会破坏响应式):

    javascript 复制代码
    let state = reactive({ count: 0 });
    state = { count: 1 }; // ❌ 错误!失去响应性
    // 正确做法:修改属性
    state.count = 1; // ✅

如何选择 ref vs reactive?

1. 使用 ref 的场景
  • 管理基本类型数据(如数字、字符串)。
  • 需要传递响应式变量 到函数或组件时(ref 更灵活)。
  • 需要明确知道某个值是响应式的(通过 .value 显式操作)。
2. 使用 reactive 的场景
  • 管理复杂对象或数组(如表单数据、配置对象)。
  • 需要集中管理多个相关属性,保持代码组织性。
  • 希望直接通过属性访问(无需 .value)。
3. 混合使用
javascript 复制代码
const state = reactive({
  count: ref(0), // 自动解包,state.count 仍是响应式
  user: ref({ name: 'Alice' })
});
console.log(state.count); // 0(无需 .value)

常见问题解答

1. 为什么 ref 需要 .value?
  • ref 通过对象包装实现响应式,.value 是统一访问和修改值的接口。
  • 在模板中自动解包是为了提升开发体验。
2. 可以全部用 ref 吗?
  • 可以,但处理对象时不如 reactive 直观:

    javascript 复制代码
    const obj = ref({ name: 'Vue' });
    obj.value.name = 'Vue 3'; // 需要 .value
  • 推荐根据数据类型选择:简单类型用 ref,复杂对象用 reactive。

3. reactive 如何响应式替换整个对象?
  • 使用 Object.assign 合并属性:

    javascript 复制代码
    const state = reactive({ count: 0 });
    Object.assign(state, { count: 1, name: 'Vue' }); // ✅ 保持响应性

示例代码对比

使用 ref:
vue 复制代码
<script setup>
import { ref } from 'vue';

const count = ref(0);
const increment = () => {
  count.value++;
};
</script>

<template>
  <button @click="increment">{{ count }}</button>
</template>
使用 reactive:
vue 复制代码
<script setup>
import { reactive } from 'vue';

const state = reactive({
  count: 0,
});
const increment = () => {
  state.count++;
};
</script>

<template>
  <button @click="increment">{{ state.count }}</button>
</template>
相关推荐
Answer1st5 小时前
【嵌入式模块】UART通信模块
笔记
和侧5 小时前
离子注入后为什么必须配套退火工艺?
笔记·学习
凛铄linshuo6 小时前
自动化测试:pytest第一个实例学习
学习·pytest
我命由我123458 小时前
智能助手通用问答边界
人工智能·python·学习·ai·学习方法·ai编程·智能体
鬼手点金8 小时前
Agent 的学习机制:后训练、上下文学习与外部化学习
java·人工智能·git·学习·自动化·nanogpt
几个几个n8 小时前
LaTeX 入门学习
学习
TheBlackHoleLab9 小时前
【Vulnhub系列】DarkHole1: 渗透测试笔记,没有踩渗透的坑,却踩到了虚拟机平台的坑,人生处处是大坑
笔记·vulnhub·easy·darkhole1
想七想八不如1140810 小时前
元学习简单入门
人工智能·pytorch·python·深度学习·学习·机器学习
ACP广源盛1392462567310 小时前
硬件选型笔记:GSV2231@ACP,DP1.4 MST 一进三出多屏扩展方案评估
笔记·硬件架构·视频·mst·国产芯片
星光不问赶路人10 小时前
Vue 3 + TypeScript 中 enum 的使用实践
前端·vue.js