当前位置:首页 > 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 操作。

vue mvvm 实现

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

以下是简化版实现流程:

vue 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 实现

    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 element实现

vue element实现

Vue Element UI 实现 Vue Element UI 是基于 Vue.js 的组件库,提供丰富的 UI 组件,适合快速开发企业级中后台产品。以下是一些关键实现方法和步骤: 安装 Vue…

vue实现表白

vue实现表白

Vue 实现表白页面 使用 Vue 可以快速创建一个动态、交互式的表白页面。以下是一个简单的实现方案: 基础结构 创建一个 Vue 项目或单文件组件,包含以下核心部分: <template&…

vue滚动实现

vue滚动实现

Vue 滚动实现方法 使用原生滚动 在 Vue 中可以通过 ref 获取 DOM 元素,调用原生滚动方法实现滚动效果。适用于简单场景。 <template> <div ref=…

vue轮播实现

vue轮播实现

Vue 轮播实现方法 使用第三方库(推荐) 安装 swiper 或 vue-awesome-swiper 库,快速实现功能丰富的轮播效果。 以 vue-awesome-swiper 为例: npm…

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

实现vue vm

实现vue vm

Vue VM 实现方法 Vue VM(ViewModel)是 Vue.js 的核心概念之一,负责连接视图(View)和数据模型(Model)。以下是实现 Vue VM 的几种方法: 使用 Vue 实…