当前位置:首页 > VUE

自己动手实现vue

2026-02-17 05:31:33VUE

实现 Vue 的核心功能

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

数据响应式

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

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());
}

模板编译

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

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 实现静态查询 在 Vue 中实现静态查询通常指不依赖后端接口,直接在前端处理数据筛选或搜索功能。以下是几种常见实现方式: 使用计算属性过滤数据 通过计算属性对静态数据进行筛选,适合简单查询场…

vue实现多选联动

vue实现多选联动

vue实现多选联动的方法 使用v-model绑定数组 在Vue中,可以通过v-model绑定一个数组来实现多选联动。当复选框被选中或取消选中时,数组会自动更新。 <template>…

vue前端实现打印功能

vue前端实现打印功能

使用Vue实现前端打印功能 在Vue项目中实现打印功能可以通过多种方式完成,以下是几种常见的方法: 使用window.print()方法 这是最简单的打印方式,直接调用浏览器的打印功能。 me…

vue实现发表

vue实现发表

Vue 实现发表功能 在 Vue 中实现发表功能通常涉及表单处理、数据绑定和网络请求。以下是实现步骤和代码示例: 表单设计与数据绑定 创建一个表单用于输入发表内容,使用 v-model 进行数据双向…

vue实现ai

vue实现ai

Vue 实现 AI 功能 Vue.js 可以通过集成第三方 AI 服务或本地 AI 模型来实现 AI 功能。以下是几种常见的方法: 集成第三方 AI API 使用 Vue 调用如 OpenAI、Go…

vue实现拖放

vue实现拖放

Vue 实现拖放功能 Vue 中实现拖放功能通常可以通过 HTML5 的原生拖放 API 或第三方库(如 vuedraggable)来实现。以下是两种方法的详细说明。 使用 HTML5 原生拖放 A…