当前位置:首页 > VUE

实现简易vue响应式

2026-02-22 06:32:22VUE

实现简易vue响应式

实现简易 Vue 响应式

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

实现简易vue响应式

使用 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 移动端签名实现方法 在移动端实现签名功能,可以通过HTML5的Canvas结合触摸事件完成。以下是具体实现步骤: 使用Canvas绘制签名 安装vue-signature-pad插件或直接使…

vue实现导航栏切图

vue实现导航栏切图

Vue 实现导航栏切图 使用 Vue Router 实现基础导航 在 Vue 项目中,可以通过 Vue Router 实现导航栏的路由切换。创建一个导航栏组件,并在其中使用 <router-li…

vue  select实现

vue select实现

Vue Select 实现方法 在 Vue 中实现下拉选择功能可以使用原生 <select> 标签或第三方库如 vue-select。以下是两种方法的详细说明: 原生 HTML Sele…

vue实现slider

vue实现slider

Vue 实现 Slider 组件 使用 Vue 实现 Slider 组件可以通过原生开发或借助第三方库。以下是两种常见方法: 原生实现 Slider 创建一个基础的 Slider 组件,通过 v-m…

vue如何实现

vue如何实现

Vue 实现方法 在 Vue 中实现功能通常涉及组件化开发、状态管理和响应式数据绑定。以下是几种常见的实现方式: 组件化开发 使用 Vue 的单文件组件(.vue 文件)结构,将 UI 拆分为可复用…

实现vue框架

实现vue框架

Vue框架的基本实现 Vue是一个渐进式JavaScript框架,用于构建用户界面。以下是实现Vue框架的基本步骤: 安装Vue 通过CDN引入Vue是最简单的方式: <script src…