当前位置:首页 > VUE

vue怎样实现响应式

2026-01-22 07:22:47VUE

Vue 响应式实现原理

Vue 的响应式系统基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现,核心是通过数据劫持结合发布-订阅模式自动追踪依赖并触发更新。

Vue 2 实现方式

  1. 数据劫持

    • 通过 Object.defineProperty 递归遍历对象的属性,将其转换为 getter/setter。
    • 示例代码:
      function defineReactive(obj, key, val) {
        Object.defineProperty(obj, key, {
          get() {
            console.log(`读取 ${key}`);
            return val;
          },
          set(newVal) {
            if (newVal === val) return;
            console.log(`更新 ${key}`);
            val = newVal;
          }
        });
      }
  2. 依赖收集

    • 在 getter 中收集依赖(如 Watcher 实例),在 setter 中通知依赖更新。
    • 每个响应式属性关联一个 Dep 实例管理依赖。
  3. 数组处理

    vue怎样实现响应式

    • 重写数组的 pushpop 等变异方法,在调用时手动触发更新。

Vue 3 实现方式

  1. Proxy 代理

    • 使用 Proxy 直接代理整个对象,无需递归初始化属性。
    • 示例代码:
      const reactive = (target) => {
        return new Proxy(target, {
          get(target, key, receiver) {
            track(target, key); // 依赖收集
            return Reflect.get(target, key, receiver);
          },
          set(target, key, value, receiver) {
            Reflect.set(target, key, value, receiver);
            trigger(target, key); // 触发更新
            return true;
          }
        });
      };
  2. Reflect 反射

    vue怎样实现响应式

    • 配合 Reflect 操作对象,避免直接操作原对象。
  3. 性能优化

    • 惰性响应式:仅在访问属性时创建响应式。
    • 嵌套属性自动代理,无需手动递归。

手动实现响应式的方法

  1. 使用 reactive/ref(Vue 3)

    import { reactive, ref } from 'vue';
    const state = reactive({ count: 0 }); // 对象
    const num = ref(1); // 基本类型
  2. 自定义响应式逻辑

    • 基于 Proxy 实现简易响应式:
      function createReactiveObject(target) {
        const handlers = {
          get(target, key) {
            console.log(`获取 ${key}`);
            return target[key];
          },
          set(target, key, value) {
            console.log(`设置 ${key}`);
            target[key] = value;
            return true;
          }
        };
        return new Proxy(target, handlers);
      }

注意事项

  • 避免直接解构响应式对象:解构会失去响应性,需使用 toRefs
  • 动态添加属性:Vue 2 需用 Vue.set,Vue 3 可直接添加。
  • 性能影响:深度响应式转换可能对大型对象产生开销。

标签: vue
分享给朋友:

相关文章

vue实现列表显示

vue实现列表显示

Vue 实现列表显示的方法 在 Vue 中实现列表显示通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式。 基本列表渲染 通过 v-for 指令遍历数组,动态生成列…

vue 指令实现

vue 指令实现

Vue 指令实现 Vue 指令是 Vue.js 提供的特殊属性,用于在 DOM 元素上添加特殊行为。指令以 v- 前缀开头,例如 v-model、v-if、v-for 等。以下是实现自定义指令和常用内…

vue 动画 实现

vue 动画 实现

vue 动画实现方法 Vue 提供了多种方式实现动画效果,主要包括过渡动画和动态动画两类。 使用 <transition> 组件实现基础过渡 通过 Vue 内置的 <transit…

vue实现机制

vue实现机制

Vue 实现机制的核心原理 Vue.js 的核心实现机制主要基于响应式系统、虚拟 DOM 和组件化设计。以下是关键实现细节: 响应式系统 Vue 通过 Object.defineProperty(V…

vue实现tree

vue实现tree

Vue 实现 Tree 组件 使用 Vue 实现 Tree 组件可以通过递归组件的方式来实现层级结构展示。以下是一个完整的实现方法: 基础递归组件实现 创建 Tree 组件文件 Tree.vue,使…

vue实现菜单定位

vue实现菜单定位

实现菜单定位的方法 在Vue中实现菜单定位功能,可以通过监听滚动事件或使用Intersection Observer API来判断当前显示的菜单项,并高亮对应的导航链接。以下是几种常见的实现方式:…