当前位置:首页 > VUE

自己动手实现vue

2026-02-17 05:31:33VUE

实现 Vue 的核心功能

要实现一个简化版的 Vue,需要关注以下几个核心功能:数据响应式、模板编译、虚拟 DOM 和依赖收集。以下是一个分步实现的方案。

数据响应式

通过 Object.definePropertyProxy 实现数据劫持,监听数据变化并触发更新。以 Proxy 为例:

自己动手实现vue

function reactive(data) {
  return new Proxy(data, {
    get(target, key) {
      track(target, key); // 依赖收集
      return target[key];
    },
    set(target, key, value) {
      target[key] = value;
      trigger(target, key); // 触发更新
      return true;
    }
  });
}

依赖收集与触发

依赖收集系统用于记录数据与视图的依赖关系:

const targetMap = new WeakMap();
let activeEffect = null;

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

function trigger(target, key) {
  const depsMap = targetMap.get(target);
  if (!depsMap) return;
  const dep = depsMap.get(key);
  if (dep) dep.forEach(effect => effect());
}

模板编译

将模板字符串转换为渲染函数:

自己动手实现vue

function compile(template) {
  // 简化版:替换插值表达式
  const renderCode = template.replace(/\{\{(.*?)\}\}/g, (_, exp) => `_s(${exp.trim()})`);
  return new Function('_s', `return ${renderCode}`);
}

虚拟 DOM 与渲染

实现一个简单的虚拟 DOM 和渲染逻辑:

function createElement(tag, props, children) {
  return { tag, props, children };
}

function render(vnode, container) {
  if (typeof vnode === 'string') {
    container.textContent = vnode;
    return;
  }
  const el = document.createElement(vnode.tag);
  for (const [key, value] of Object.entries(vnode.props || {})) {
    el.setAttribute(key, value);
  }
  (vnode.children || []).forEach(child => render(child, el));
  container.appendChild(el);
}

组件系统

实现一个基础的组件类:

class Component {
  constructor(options) {
    this.$options = options;
    this._data = reactive(options.data());
    this._el = null;
    this._update = () => {
      const vnode = this.$options.render.call(this);
      render(vnode, this._el);
    };
    effect(this._update);
  }

  mount(el) {
    this._el = el;
    this._update();
  }
}

使用示例

const app = new Component({
  data() {
    return { message: 'Hello Vue' };
  },
  render() {
    return createElement('div', null, this.message);
  }
});

app.mount(document.getElementById('app'));

注意事项

  1. 上述实现是简化版,实际 Vue 源码更复杂,包含优化和边界处理。
  2. 现代 Vue 3 使用 Proxy 代替 Object.defineProperty 实现响应式。
  3. 完整的 Vue 需要实现更多功能如指令、生命周期、组件通信等。

标签: 自己动手vue
分享给朋友:

相关文章

vue实现答题

vue实现答题

Vue 实现答题功能 数据结构设计 使用 Vue 的响应式特性管理题目和答案数据。通常需要以下数据结构: data() { return { questions: [ {…

vue toast实现

vue toast实现

Vue Toast 实现方法 使用第三方库(推荐) 安装 vue-toastification 库,这是一个功能丰富且轻量级的 Vue Toast 插件。 npm install vue-toast…

vue实现例子

vue实现例子

以下是一些常见的 Vue 实现例子,涵盖基础功能到进阶应用场景: 基础数据绑定 使用 v-model 实现双向数据绑定: <template> <div> &l…

实现vue message

实现vue message

实现 Vue 消息提示组件 创建 Message 组件 在 src/components 目录下创建 Message.vue 文件,内容如下: <template> <tran…

vue广播实现

vue广播实现

vue广播实现 在Vue中实现广播功能可以通过事件总线(Event Bus)或Vuex来完成。以下是两种常见的实现方式: 使用事件总线(Event Bus) 事件总线是一种简单的跨组件通信方式,适用…

vue实现穿梭框

vue实现穿梭框

Vue 穿梭框实现方法 穿梭框(Transfer)是一种常见的UI组件,用于在两个列表之间移动数据项。以下是基于Vue的实现方法。 基础结构搭建 创建两个列表容器和一个操作按钮区域,使用v-mode…