当前位置:首页 > 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 实现方法 Vue 是一种流行的前端框架,用于构建用户界面和单页应用。以下是几种常见的 Vue 实现方法: 创建 Vue 实例 通过 new Vue() 创建一个 Vue 实例,传入配置对象,…

ssh vue 实现

ssh vue 实现

使用SSH连接Vue项目部署的服务器 在Vue项目开发或部署过程中,可能需要通过SSH连接到远程服务器进行配置或维护。以下是实现SSH连接并部署Vue项目的关键步骤: 生成SSH密钥对 在本地终端运…

vue实现看板

vue实现看板

Vue 实现看板功能 使用 Vue 实现看板功能可以通过组件化开发、状态管理和拖拽库结合完成。以下是一个完整的实现方案: 基础项目结构 src/ ├── components/ │ ├── Ka…

vue实现treeselect

vue实现treeselect

Vue TreeSelect 实现方法 使用 Vue 实现 TreeSelect 组件可以通过以下几种方式完成,包括使用现成的第三方库或自行封装组件。 使用第三方库 推荐使用成熟的第三方 TreeS…

vue实现筛选

vue实现筛选

实现筛选功能的基本思路 在Vue中实现筛选功能通常需要结合数据绑定、计算属性和方法。筛选的核心逻辑是根据用户输入的条件过滤原始数据列表,并动态更新显示结果。 数据准备 定义一个数组存储原始数据,另一…

vue 实现excel

vue 实现excel

Vue 实现 Excel 功能 前端导出 Excel 使用 xlsx 库可以轻松实现前端 Excel 导出功能。安装依赖: npm install xlsx 导出 Excel 示例代码: impo…