当前位置:首页 > 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. 数组处理

    • 重写数组的 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 反射

    • 配合 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 实现方法 Vue 是一种流行的前端框架,用于构建用户界面和单页应用。以下是几种常见的 Vue 实现方法: 创建 Vue 实例 通过 new Vue() 创建一个 Vue 实例,传入配置对象…

vue实现图集

vue实现图集

Vue 实现图集的方法 在 Vue 中实现图集功能可以通过多种方式完成,以下是一些常见的方法和实现步骤。 使用第三方库(如 vue-image-lightbox) 安装 vue-image-lig…

vue实现markdown

vue实现markdown

Vue 实现 Markdown 编辑器 在 Vue 中实现 Markdown 编辑器可以通过集成第三方库或自定义解析器完成。以下是两种常见方法: 使用第三方库(如 marked 或 markdow…

vue实现fullpage

vue实现fullpage

Vue 实现 FullPage 效果 在 Vue 中实现全屏滚动(FullPage)效果可以通过多种方式完成,以下是几种常见的方法: 使用现有库 vue-fullpage.js 安装 vue-ful…

vue实现toast

vue实现toast

Vue 实现 Toast 的方法 使用第三方库(推荐) 对于快速实现 Toast 功能,推荐使用成熟的第三方库如 vue-toastification 或 vant 的 Toast 组件。 安装…

vue实现slot

vue实现slot

Vue 中的 Slot 实现方法 Vue 的 slot 是一种内容分发机制,允许父组件向子组件插入内容。以下是几种常见的 Slot 实现方式: 默认 Slot 子组件通过 <slot>…