开发

软件开发相关知识

Vue 3.5响应式原理:Proxy与副作用追踪深度剖析

一、响应式概述

1.1 Vue响应式演进

  • Vue 2:Object.defineProperty

  • Vue 3:Proxy

  • Vue 3.5:响应式系统重构,更高效

1.2 核心概念

数据变化 → 触发更新
   ↑
  依赖追踪
   ↑
  访问收集
   ↑
  Proxy拦截

二、Proxy实现

2.1 基础Proxy

const proxy = new Proxy(target, {
  get(target, key, receiver) {
    track(target, key);
    return Reflect.get(target, key, receiver);
  },
  set(target, key, value, receiver) {
    const result = Reflect.set(target, key, value, receiver);
    trigger(target, key);
    return result;
  }
});

三、依赖收集系统

3.1 依赖存储结构

// WeakMap: target -> Map -> Set
const targetMap = new WeakMap();

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

function trigger(target, key) {
  const dep = targetMap.get(target)?.get(key);
  dep?.forEach(effect => effect());
}

四、computed实现

4.1 computed原理

class ComputedRefImpl {
  constructor(getter) {
    this._dirty = true;
    this.effect = effect(getter, {
      lazy: true,
      scheduler: () => { this._dirty = true; }
    });
  }

  get value() {
    if (this._dirty) {
      this._value = this.effect.run();
      this._dirty = false;
    }
    return this._value;
  }
}

五、Vue 3.5改进

5.1 响应式Props解构

();
console.log(title); // 无需props." _ue_custom_node_="true">

六、总结

Vue 3.5响应式要点:
1. Proxy:拦截所有操作
2. 依赖收集:访问时记录
3. 触发更新:修改时通知
4. computed:惰性求值