DukeDuke
主页
文档转换
关于我们
主页
文档转换
关于我们
  • 目录

    • Vue3简介
    • Vue3响应式系统
    • Vue3组合式API
    • Vue3生命周期
    • Vue3模板语法
    • Vue3组件系统
    • Vue3 路由系统
    • Vue3 状态管理
    • Vue3 性能优化
    • Vue3 TypeScript 支持
    • Vue3 项目实战
    • VUE 面试题大全
    • Node.js 安装

Vue3 响应式系统详解

概述

Vue3 的响应式系统是整个框架的核心,它让数据变化能够自动触发视图更新。简单来说,就像是一个智能的观察者,当你改变数据时,它会立即通知所有依赖这个数据的地方进行更新。

响应式原理

Vue3 使用 Proxy 代理对象来实现响应式,这比 Vue2 的 Object.defineProperty 更加高效和灵活。Proxy 可以拦截对象的各种操作,比如读取、设置、删除属性等。

响应式 API

Vue3 提供了几个核心的响应式 API:

ref()

用于基本类型数据,比如数字、字符串、布尔值

import { ref } from "vue";

const count = ref(0);
const message = ref("Hello Vue3");
const isVisible = ref(true);

// 访问值需要使用 .value
console.log(count.value); // 0
count.value++; // 1

reactive()

用于对象和数组,让整个对象变成响应式

import { reactive } from "vue";

const user = reactive({
  name: "张三",
  age: 25,
  hobbies: ["读书", "游泳"],
});

// 直接修改属性
user.age = 26;
user.hobbies.push("编程");

computed()

计算属性,基于其他响应式数据自动计算

import { computed } from "vue";

const doubleCount = computed(() => count.value * 2);
const fullName = computed(() => `${user.firstName} ${user.lastName}`);

watch()

监听器,当数据变化时执行副作用

import { watch } from "vue";

// 监听单个响应式数据
watch(count, (newValue, oldValue) => {
  console.log(`count从${oldValue}变为${newValue}`);
});

// 监听多个数据
watch([count, user.name], ([newCount, newName], [oldCount, oldName]) => {
  console.log("数据发生变化");
});

响应式原理深入理解

Proxy vs Object.defineProperty

Vue2 使用 Object.defineProperty 来劫持对象的属性,这种方式有以下限制:

  1. 无法监听数组索引和长度的变化
  2. 无法监听对象属性的添加和删除
  3. 需要递归遍历对象的所有属性

Vue3 使用 Proxy 解决了这些问题:

  1. 可以监听数组的所有变化
  2. 可以监听对象属性的添加和删除
  3. 性能更好,不需要递归遍历

依赖收集和触发更新

当组件渲染时,Vue3 会:

  1. 依赖收集: 在读取响应式数据时,将当前组件添加到该数据的依赖列表中
  2. 触发更新: 当数据变化时,通知所有依赖该数据的组件进行更新

最佳实践

1. 合理使用 ref 和 reactive

  • 使用 ref 处理基本类型数据
  • 使用 reactive 处理对象和数组
  • 避免在 reactive 对象中嵌套 ref

2. 避免响应式丢失

// ❌ 错误:会丢失响应式
const { name, age } = reactive(user);

// ✅ 正确:保持响应式
const name = computed(() => user.name);
const age = computed(() => user.age);

3. 使用 toRefs 解构响应式对象

import { toRefs } from "vue";

const { name, age } = toRefs(reactive(user));
// 现在 name 和 age 都是响应式的 ref

总结

Vue3 的响应式系统通过 Proxy 提供了更强大、更高效的响应式能力。理解其工作原理和正确使用各种 API,可以帮助你构建更好的 Vue 应用。

最近更新:: 2026/4/17 13:21
Contributors: Duke
Prev
Vue3简介
Next
Vue3组合式API