当前位置:首页 > VUE

proxy实现vue

2026-01-08 01:04:26VUE

使用 Proxy 实现 Vue 响应式系统

Vue 3 的响应式系统基于 JavaScript 的 Proxy API,通过代理对象实现对属性的拦截和依赖追踪。以下是实现的核心逻辑:

proxy实现vue

创建响应式对象

function reactive(target) {
  const handler = {
    get(target, key, receiver) {
      track(target, key); // 依赖收集
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      const oldValue = target[key];
      const result = Reflect.set(target, key, value, receiver);
      if (oldValue !== value) {
        trigger(target, key); // 触发更新
      }
      return result;
    }
  };
  return new Proxy(target, handler);
}

依赖收集与触发

const targetMap = new WeakMap(); // 存储依赖关系

function track(target, key) {
  if (activeEffect) {
    let depsMap = targetMap.get(target);
    if (!depsMap) {
      targetMap.set(target, (depsMap = new Map()));
    }
    let dep = depsMap.get(key);
    if (!dep) {
      depsMap.set(key, (dep = new Set()));
    }
    dep.add(activeEffect);
  }
}

function trigger(target, key) {
  const depsMap = targetMap.get(target);
  if (!depsMap) return;
  const effects = depsMap.get(key);
  effects && effects.forEach(effect => effect());
}

实现计算属性

let activeEffect;

function effect(fn) {
  activeEffect = fn;
  fn(); // 立即执行以收集依赖
  activeEffect = null;
}

function computed(getter) {
  let value;
  let dirty = true;

  const runner = effect(getter, {
    lazy: true,
    scheduler() {
      dirty = true;
    }
  });

  return {
    get value() {
      if (dirty) {
        value = runner();
        dirty = false;
      }
      return value;
    }
  };
}

与 Vue 2 的对比

  1. Object.defineProperty 的局限性

    • 无法检测新增/删除属性
    • 对数组操作需要特殊处理
    • 需要递归遍历所有属性
  2. Proxy 的优势

    • 直接拦截对象所有操作
    • 完美支持数组变化检测
    • 惰性响应式(按需转换)
    • 性能更好(无需初始化递归)

实际应用示例

const state = reactive({
  count: 0,
  todos: []
});

effect(() => {
  console.log(`Count is: ${state.count}`);
});

state.count++; // 自动触发日志输出
state.todos.push('Learn Proxy'); // 数组变更也能触发

注意事项

  1. 原始对象与代理对象不同,应始终使用代理对象
  2. 嵌套对象需要递归转换为响应式
  3. 避免在响应式对象中存储非响应式数据
  4. 浏览器兼容性需要考虑(IE 不支持 Proxy)

通过这种实现方式,可以构建出类似 Vue 3 的响应式系统核心功能,包括数据绑定、计算属性和依赖追踪等特性。

proxy实现vue

标签: proxyvue
分享给朋友:

相关文章

vue实现点击样式

vue实现点击样式

Vue 实现点击样式的方法 在 Vue 中实现点击样式可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 v-bind:class 动态绑定类名 通过数据驱动的方式动态切换类名,结合 CS…

vue实现组件循环

vue实现组件循环

Vue 组件循环的实现方法 在 Vue 中实现组件循环通常使用 v-for 指令,可以循环渲染数组或对象的数据到组件上。 基本数组循环 通过 v-for 指令遍历数组,渲染多个相同结构的组件。…

vue怎么实现页面返回

vue怎么实现页面返回

Vue 实现页面返回的方法 在 Vue 中实现页面返回功能,可以通过以下几种方式完成,具体取决于项目使用的路由模式和技术栈。 使用 Vue Router 的编程式导航 通过 this.$router…

vue实现按卡片轮播

vue实现按卡片轮播

实现卡片轮播的基本思路 在Vue中实现卡片轮播可以通过结合v-for指令和动态样式绑定完成。核心是维护一个当前显示卡片的索引,通过CSS过渡效果实现平滑切换。 基础实现步骤 模板部分 使用v-for…

vue实现活动倒计时

vue实现活动倒计时

实现活动倒计时的基本思路 在Vue中实现活动倒计时通常需要获取当前时间与活动结束时间的差值,并将其转换为天、小时、分钟、秒的格式展示。通过定时器每秒更新显示的时间。 定义倒计时数据 在Vue组件的d…

vue实现点击

vue实现点击

实现点击事件的基本方法 在Vue中实现点击事件可以通过v-on指令或@简写方式绑定。以下是常见的点击事件绑定方法: <template> <button v-on:click…