当前位置:首页 > VUE

vue mvvm 实现

2026-03-07 09:21:42VUE

Vue MVVM 实现原理

Vue 的 MVVM(Model-View-ViewModel)实现主要依赖于数据绑定和响应式系统。以下是其核心实现机制:

数据劫持与响应式

Vue 通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)劫持数据对象的属性访问和修改。当数据变化时,触发依赖的视图更新。

// Vue 2 数据劫持示例
function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log('get', key);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log('set', key);
        val = newVal;
      }
    }
  });
}

依赖收集与发布订阅

每个响应式属性关联一个 Dep(依赖收集器),在 getter 中收集依赖(Watcher),在 setter 中通知更新。

class Dep {
  constructor() {
    this.subs = [];
  }
  addSub(sub) {
    this.subs.push(sub);
  }
  notify() {
    this.subs.forEach(sub => sub.update());
  }
}

虚拟 DOM 与 Diff 算法

Vue 将模板编译为虚拟 DOM(VNode),通过 Diff 算法比对变化后生成最小化 DOM 操作。

function patch(oldVnode, vnode) {
  if (sameVnode(oldVnode, vnode)) {
    patchVnode(oldVnode, vnode);
  } else {
    const parent = oldVnode.parentNode;
    parent.insertBefore(createElm(vnode), oldVnode);
    parent.removeChild(oldVnode);
  }
}

模板编译

Vue 将模板编译为渲染函数,通过 with 语句和 new Function 生成可执行代码。

function compile(template) {
  const ast = parse(template);
  const code = generate(ast);
  return new Function(`with(this){return ${code}}`);
}

实现简易 MVVM

以下是简化版实现流程:

  1. 数据监听

    function observe(data) {
    if (typeof data !== 'object') return;
    Object.keys(data).forEach(key => {
     defineReactive(data, key, data[key]);
    });
    }
  2. 编译模板

    function compile(el, vm) {
    el.childNodes.forEach(node => {
     if (node.nodeType === 1) {
       compileElement(node, vm);
     } else if (node.nodeType === 3 && /\{\{(.*)\}\}/.test(node.textContent)) {
       compileText(node, vm);
     }
    });
    }
  3. Watcher 实现

    vue mvvm 实现

    class Watcher {
    constructor(vm, key, updateFn) {
     this.vm = vm;
     this.key = key;
     this.updateFn = updateFn;
     Dep.target = this;
     this.vm[this.key]; // 触发getter收集依赖
     Dep.target = null;
    }
    update() {
     this.updateFn.call(this.vm, this.vm[this.key]);
    }
    }

关键设计模式

  • 观察者模式:通过 Dep 和 Watcher 实现数据与视图的联动
  • 代理模式:Vue 3 的 Proxy 拦截对象操作
  • 装饰器模式:通过 @Component 等装饰器增强类功能

Vue 的 MVVM 实现通过数据驱动视图,开发者只需关注数据状态,DOM 操作由框架自动完成。这种设计显著提高了开发效率和代码可维护性。

标签: vuemvvm
分享给朋友:

相关文章

vue实现展开与收起

vue实现展开与收起

Vue 实现展开与收起功能 在 Vue 中实现展开与收起功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-show 或 v-if 控制显示 通过 Vue 的指令 v-show 或 v-if…

vue功能实现

vue功能实现

Vue 功能实现指南 Vue.js 是一个渐进式 JavaScript 框架,广泛用于构建用户界面。以下是 Vue 功能的常见实现方法。 数据绑定 Vue 的核心功能之一是数据绑定,通过 v-mod…

vue实现erp

vue实现erp

Vue实现ERP系统的关键步骤 技术选型与架构设计 采用Vue 3 + TypeScript构建前端,搭配Pinia状态管理,Element Plus或Ant Design Vue作为UI框架。后端可…

vue实现订单

vue实现订单

Vue 实现订单功能 订单数据结构设计 订单数据通常包含以下字段: order: { id: String, // 订单ID userId: String,…

vue 实现轮播

vue 实现轮播

Vue 实现轮播的方法 使用第三方库(如 Swiper) 安装 Swiper 库: npm install swiper 在 Vue 组件中引入 Swiper: <template>…

vue单选实现

vue单选实现

Vue 单选实现 在 Vue 中实现单选功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 绑定单选按钮 通过 v-model 绑定一个变量,可以实现单选效果。当用户选择不同的选…