当前位置:首页 > 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 的局限性。

vue响应式实现

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响应式实现

    • 遍历数据对象,劫持属性的访问和修改。
    • 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 示例

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 实现复选功能 在 Vue 中实现复选功能可以通过多种方式完成,以下是常见的几种方法: 使用 v-model 绑定数组 通过 v-model 绑定一个数组,可以自动收集用户选择的复选框值。…

ssh vue 实现

ssh vue 实现

使用SSH连接Vue项目部署的服务器 在Vue项目开发或部署过程中,可能需要通过SSH连接到远程服务器进行配置或维护。以下是实现SSH连接并部署Vue项目的关键步骤: 生成SSH密钥对 在本地终端运…

vue轮询实现

vue轮询实现

Vue 轮询实现方法 在 Vue 中实现轮询可以通过以下几种方式: 使用 setInterval data() { return { pollInterval: null }…

实现vue table

实现vue table

Vue 表格实现方法 基础表格实现 使用 Vue 的 v-for 指令可以快速渲染表格数据。在模板中定义表格结构,通过数据绑定动态生成行和列。 <template> <tabl…

vue代理实现

vue代理实现

Vue 代理实现方法 在 Vue 项目中,配置代理可以解决开发环境下的跨域问题,通常通过修改 vue.config.js 文件实现。以下是几种常见的代理配置方式: 基础代理配置 在 vue.conf…

vue实现抖动

vue实现抖动

Vue 实现抖动效果 在 Vue 中实现抖动效果可以通过 CSS 动画或 JavaScript 动画库来实现。以下是几种常见的方法: 使用 CSS 动画 通过定义 @keyframes 动画并在 V…