当前位置:首页 > VUE

vue响应式实现

2026-02-09 09:26:08VUE

Vue 响应式实现原理

Vue 的响应式系统是其核心特性之一,通过数据劫持和依赖收集实现。以下是 Vue 2.x 和 Vue 3.x 响应式实现的主要机制:

Vue 2.x 的响应式实现

Vue 2.x 使用 Object.defineProperty 实现数据劫持,通过递归遍历对象的属性,将其转换为 getter/setter。

数据劫持

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log(`读取 ${key}`);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log(`设置 ${key} 为 ${newVal}`);
        val = newVal;
      }
    }
  });
}

依赖收集与派发更新

  • 每个组件实例对应一个 Watcher 实例,负责订阅数据变化。
  • 在 getter 中收集依赖(Dep.target 指向当前 Watcher)。
  • 在 setter 中触发依赖更新(调用 Watcherupdate 方法)。

局限性

  • 无法检测对象属性的添加或删除(需使用 Vue.set/Vue.delete)。
  • 数组的变异方法(如 pushpop)需通过重写实现响应式。

Vue 3.x 的响应式实现

Vue 3.x 使用 Proxy 替代 Object.defineProperty,解决了 Vue 2.x 的局限性。

Proxy 实现

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      console.log(`读取 ${key}`);
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      console.log(`设置 ${key} 为 ${value}`);
      return Reflect.set(target, key, value, receiver);
    }
  });
}

依赖收集优化

  • 引入 effect 函数(类似 Vue 2.x 的 Watcher),通过 tracktrigger 实现依赖管理。
  • 使用 WeakMapMap 存储依赖关系,提升性能。

优势

  • 支持动态添加/删除属性。
  • 默认支持数组索引和长度变化。
  • 性能更高,无需递归遍历对象。

响应式系统的核心流程

  1. 初始化阶段

    • 遍历数据对象,劫持属性的访问和修改。
    • Vue 2.x 递归转换,Vue 3.x 惰性转换(按需代理)。
  2. 依赖收集

    • 在属性被访问时(getter),将当前依赖(如 Watchereffect)记录到 Dep 中。
  3. 派发更新

    • 在属性被修改时(setter),通知所有依赖触发更新(如重新渲染组件)。

示例对比

Vue 2.x 示例

const vm = new Vue({
  data: { count: 0 }
});
vm.count++; // 触发 setter,更新视图

Vue 3.x 示例

vue响应式实现

const state = reactive({ count: 0 });
effect(() => {
  console.log(state.count); // 自动追踪依赖
});
state.count++; // 触发 effect 重新执行

注意事项

  • Vue 2.x 中,响应式数据需在 data 中预先声明。
  • Vue 3.x 的 refreactive 需根据场景选择:
    • ref 用于基本类型,通过 .value 访问。
    • reactive 用于对象,直接解构会丢失响应性(需使用 toRefs)。

标签: vue
分享给朋友:

相关文章

vue 实现在线预览

vue 实现在线预览

Vue 实现在线预览的常见方法 使用 iframe 嵌入 通过 iframe 标签可以嵌入多种类型的文件,如 PDF、图片、网页等。需要确保文件地址可访问。 <template> &…

vue实现表白

vue实现表白

Vue 实现表白页面 使用 Vue 可以快速创建一个动态、交互式的表白页面。以下是一个简单的实现方案: 基础结构 创建一个 Vue 项目或单文件组件,包含以下核心部分: <template&…

vue实现webapp

vue实现webapp

Vue 实现 WebApp 的基本步骤 环境准备 确保已安装 Node.js 和 npm/yarn。通过 Vue CLI 或 Vite 创建项目: npm install -g @vue/cli v…

vue 实现ztree

vue 实现ztree

在Vue中实现类似ZTree的功能,可以通过集成第三方库或自定义组件完成。以下是两种常见方法: 使用vue-tree组件 vue-tree是一个轻量级的Vue树形组件,支持复选框、懒加载等功能,适合…

vue实现gridlayout

vue实现gridlayout

Vue 实现 Grid Layout 使用 CSS Grid 布局 CSS Grid 是一种强大的布局系统,可以直接在 Vue 组件的样式中使用。通过定义网格容器和网格项,可以快速实现复杂的布局结构。…

vue实现反转

vue实现反转

实现数组反转 在Vue中反转数组可以通过多种方式实现,以下是几种常见方法: 使用JavaScript原生reverse方法 // 在methods中定义方法 methods: { revers…