Q20: Create a Reactive Auto-Tracking State Store Using Proxy

Create an automated reactive store where accessing properties inside a watchEffect callback registers dependencies and mutating properties triggers re-execution.

Proxy-Based Reactive State Store
let activeEffect = null;

function createReactiveStore(initialState) {
  const deps = new Map();

  return new Proxy(initialState, {
    get(target, key, receiver) {
      if (activeEffect) {
        if (!deps.has(key)) deps.set(key, new Set());
        deps.get(key).add(activeEffect);
      }
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      const result = Reflect.set(target, key, value, receiver);
      if (deps.has(key)) {
        deps.get(key).forEach(effect => effect());
      }
      return result;
    }
  });
}

function watchEffect(effect) {
  activeEffect = effect;
  effect();
  activeEffect = null;
}
💡 Active effects trigger getter traps to register keys as dependencies, allowing setter traps to re-run affected callbacks on change.
Key Takeaways
  • Core architecture powering reactivity in modern frameworks (e.g. Vue 3 Reactivity).
  • get traps track active effect dependencies; set traps notify and re-run dependent effects.
Knowledge Check

How does watchEffect automatically detect which store keys an effect function depends on?