当前位置:首页 > VUE

实现简易vue响应式

2026-02-22 06:32:22VUE

实现简易vue响应式

实现简易 Vue 响应式

要实现一个简易的 Vue 响应式系统,核心是利用 JavaScript 的 Object.defineProperty 或 ES6 的 Proxy 来劫持数据的变化,并在数据变化时触发更新。以下是两种实现方式:

使用 Object.defineProperty

function defineReactive(obj, key, val) {
  // 递归处理嵌套对象
  observe(val);
  Object.defineProperty(obj, key, {
    get() {
      console.log(`get ${key}: ${val}`);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log(`set ${key}: ${newVal}`);
        observe(newVal); // 处理新值为对象的情况
        val = newVal;
      }
    }
  });
}

function observe(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return;
  }
  Object.keys(obj).forEach(key => {
    defineReactive(obj, key, obj[key]);
  });
}

const data = { foo: 'foo', bar: { a: 1 } };
observe(data);

使用 Proxy

function reactive(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }
  return new Proxy(obj, {
    get(target, key) {
      console.log(`get ${key}`);
      return reactive(target[key]);
    },
    set(target, key, val) {
      console.log(`set ${key}`);
      target[key] = val;
      return true;
    }
  });
}

const data = reactive({ foo: 'foo', bar: { a: 1 } });

依赖收集与更新

为了实现类似 Vue 的依赖收集和更新,可以引入一个简单的 Dep 和 Watcher 机制:

class Dep {
  constructor() {
    this.subscribers = new Set();
  }
  depend() {
    if (activeEffect) {
      this.subscribers.add(activeEffect);
    }
  }
  notify() {
    this.subscribers.forEach(effect => effect());
  }
}

let activeEffect = null;
function watchEffect(effect) {
  activeEffect = effect;
  effect();
  activeEffect = null;
}

function reactive(obj) {
  const deps = new Map();
  return new Proxy(obj, {
    get(target, key) {
      let dep = deps.get(key);
      if (!dep) {
        dep = new Dep();
        deps.set(key, dep);
      }
      dep.depend();
      return target[key];
    },
    set(target, key, val) {
      target[key] = val;
      const dep = deps.get(key);
      if (dep) {
        dep.notify();
      }
      return true;
    }
  });
}

const state = reactive({ count: 0 });
watchEffect(() => {
  console.log(`count is: ${state.count}`);
});

以上代码实现了一个简易的 Vue 响应式系统,包括数据劫持、依赖收集和更新触发。实际 Vue 的实现会更加复杂,包括虚拟 DOM 比对、组件系统等,但核心原理与此类似。

实现简易vue响应式

标签: 简易vue
分享给朋友:

相关文章

vue中实现显示和隐藏

vue中实现显示和隐藏

控制显示与隐藏的方法 在Vue中实现元素的显示和隐藏可以通过多种方式完成,以下是常见的几种方法: 1. 使用v-if指令v-if根据条件动态添加或移除DOM元素,适合需要频繁切换的场景。当条件为f…

vue实现画圆弧并着色

vue实现画圆弧并着色

在 Vue 中实现画圆弧并着色 使用 Canvas API 绘制圆弧 在 Vue 组件的 mounted 钩子中,通过 Canvas API 绘制圆弧。创建一个 canvas 元素并获取其上下文:…

vue实现矩阵

vue实现矩阵

Vue 实现矩阵的方法 在 Vue 中实现矩阵操作可以通过多种方式完成,以下是一些常见的方法: 使用二维数组表示矩阵 矩阵可以用二维数组来表示,每个元素对应矩阵中的一个值。在 Vue 的 data…

vue实现过程

vue实现过程

Vue 的实现过程 Vue 的实现过程可以分为多个核心模块,包括响应式系统、虚拟 DOM、模板编译等。以下是 Vue 的主要实现过程分析。 响应式系统 Vue 的响应式系统基于 Object.def…

vue实现效果

vue实现效果

以下是Vue实现常见效果的几种典型方法,分为不同场景说明: 数据绑定与响应式更新 使用v-model实现表单双向绑定: <template> <input v-model…

vue实现$.extend

vue实现$.extend

Vue 实现类似 jQuery 的 $.extend 功能 在 Vue 中实现类似 jQuery 的 $.extend 功能,可以通过多种方式完成。$.extend 主要用于合并多个对象的属性,Vue…