当前位置:首页 > VUE

proxy实现vue

2026-03-07 12:38:16VUE

使用 Proxy 实现 Vue 响应式系统

Vue 3 的响应式系统基于 JavaScript 的 Proxy 实现,通过代理对象拦截属性的读取和修改操作,实现数据变化的自动追踪和更新。以下是核心实现方法:

基本响应式实现

通过 Proxy 拦截对象的 getset 操作,结合副作用函数(effect)实现依赖收集和触发更新:

proxy实现vue

const reactiveMap = new WeakMap();

function reactive(target) {
  if (reactiveMap.has(target)) {
    return reactiveMap.get(target);
  }

  const proxy = 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;
    }
  });

  reactiveMap.set(target, proxy);
  return proxy;
}

// 当前激活的副作用函数
let activeEffect = null;

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());
}

副作用函数管理

通过 effect 函数注册副作用,在属性被访问时自动建立依赖关系:

proxy实现vue

const targetMap = new WeakMap();

function effect(fn) {
  activeEffect = fn;
  fn(); // 执行时会触发 track
  activeEffect = null;
}

// 使用示例
const state = reactive({ count: 0 });

effect(() => {
  console.log('Count changed:', state.count);
});

state.count++; // 自动触发日志输出

计算属性实现

基于响应式系统和副作用函数,可以实现计算属性:

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

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

  const obj = {
    get value() {
      if (dirty) {
        value = runner();
        dirty = false;
      }
      track(obj, 'value');
      return value;
    }
  };

  return obj;
}

// 使用示例
const state = reactive({ a: 1, b: 2 });
const sum = computed(() => state.a + state.b);

effect(() => {
  console.log('Sum:', sum.value);
});

state.a = 3; // 触发重新计算和日志输出

响应式 Ref 实现

对于基本类型值,可以通过 ref 包装为响应式对象:

function ref(value) {
  return reactive({
    value
  });
}

// 使用示例
const count = ref(0);

effect(() => {
  console.log('Ref value:', count.value);
});

count.value++; // 触发更新

注意事项

  1. Proxy 无法检测到属性的添加或删除,Vue 3 提供了 setdelete API 作为补充
  2. 数组的特殊处理需要额外拦截 push/pop 等方法
  3. 性能优化需要考虑嵌套对象的代理缓存
  4. 浏览器兼容性需要注意(Proxy 无法被 polyfill)

以上实现展示了 Vue 3 响应式系统的核心原理,实际实现还包含更多优化和边界情况处理。

标签: proxyvue
分享给朋友:

相关文章

vue中登陆实现逻辑

vue中登陆实现逻辑

Vue 中登录实现逻辑 前端实现逻辑 表单验证 使用 Vue 的表单验证库(如 VeeValidate)或自定义验证规则,确保用户输入的账号和密码符合要求。例如,检查邮箱格式、密码长度等。 发送登录…

vue树形实现

vue树形实现

Vue 树形组件实现方法 使用递归组件实现树形结构 递归组件是 Vue 中实现树形结构的常见方法。通过组件调用自身的方式,可以轻松构建多层嵌套的树形结构。 <template> &l…

vue架构实现

vue架构实现

Vue 架构实现核心方案 Vue.js 的架构实现通常围绕模块化、组件化和状态管理展开。以下为常见实现方案: 基于单文件组件(SFC)的模块化 通过 .vue 文件组织模板、脚本和样式: <…

vue实现滑块

vue实现滑块

Vue 实现滑块组件的方法 使用原生 HTML 和 Vue 指令 通过 Vue 的 v-model 和事件监听实现基础滑块功能。创建一个包含 input 元素的组件,类型设置为 range,并绑定到…

vue实现单据

vue实现单据

Vue 实现单据功能的方法 使用 Vue 实现单据功能通常涉及表单设计、数据绑定、验证和提交等环节。以下是具体实现方案: 表单设计与数据绑定 使用 Vue 的 v-model 指令实现表单数据的双向…

vue实现导入

vue实现导入

Vue 实现文件导入功能 使用 <input type="file"> 元素 在 Vue 模板中添加一个文件输入元素,绑定 change 事件处理函数。 <template>…