当前位置:首页 > VUE

vue实现mvvm

2026-02-10 12:14:37VUE

Vue 的 MVVM 实现原理

Vue 通过数据劫持和发布-订阅模式实现 MVVM(Model-View-ViewModel)架构。核心在于数据绑定和响应式系统。

数据劫持(响应式系统)

Vue 使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)劫持数据对象的属性,监听数据变化。当数据被修改时,触发视图更新。

Vue 2 实现示例:

vue实现mvvm

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      val = newVal;
      // 触发更新
      dep.notify();
    }
  });
}

Vue 3 实现示例:

const reactive = (target) => {
  return new Proxy(target, {
    get(target, key) {
      return Reflect.get(target, key);
    },
    set(target, key, value) {
      Reflect.set(target, key, value);
      // 触发更新
      trigger(target, key);
      return true;
    }
  });
};

依赖收集(发布-订阅模式)

每个响应式属性有一个依赖收集器(Dep),用于存储依赖该属性的 Watcher(订阅者)。当数据变化时,Dep 通知所有 Watcher 更新视图。

vue实现mvvm

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

class Watcher {
  update() {
    // 更新视图
    patch();
  }
}

模板编译

Vue 将模板编译为渲染函数,生成虚拟 DOM(VNode)。通过对比新旧 VNode,高效更新真实 DOM。

// 模板
<div>{{ message }}</div>

// 编译为渲染函数
function render() {
  return h('div', this.message);
}

双向数据绑定

通过 v-model 实现表单元素与数据的双向绑定,本质是语法糖,结合 :value@input

<input v-model="message">
<!-- 等价于 -->
<input :value="message" @input="message = $event.target.value">

关键点总结

  • 数据劫持:通过 Object.definePropertyProxy 监听数据变化。
  • 依赖收集:每个属性维护一个 Dep,收集依赖的 Watcher。
  • 模板编译:将模板转为渲染函数,生成 VNode。
  • 虚拟 DOM:通过 Diff 算法高效更新视图。
  • 双向绑定v-model 简化表单数据同步。

标签: vuemvvm
分享给朋友:

相关文章

vue实现sql操作

vue实现sql操作

在Vue中实现SQL操作通常需要结合后端服务或本地数据库技术,因为前端JavaScript无法直接连接SQL数据库。以下是几种常见的实现方式: 通过API与后端交互 Vue前端通过HTTP请求(如a…

vue实现海报

vue实现海报

Vue 实现海报生成方案 使用 html2canvas 库 html2canvas 是一个将 HTML 元素转换为 Canvas 的库,适合将 Vue 组件渲染为海报图片 安装依赖: npm in…

vue 实现hover

vue 实现hover

Vue 实现 Hover 效果的方法 在 Vue 中实现 hover 效果可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 伪类 :hover 最简单的方式是直接使用 CSS 的 :hov…

vue实现div单选

vue实现div单选

Vue 实现 div 单选 在 Vue 中实现 div 单选可以通过 v-model 结合 v-for 和事件绑定来完成。以下是具体实现方法: 模板部分 <template>…

vue 实现页面返回

vue 实现页面返回

实现页面返回的方法 在Vue中实现页面返回功能可以通过多种方式实现,以下是几种常见的方案: 使用Vue Router的go方法 通过Vue Router的go方法可以控制浏览器的历史记录导航。rou…

vue嵌套grafana实现

vue嵌套grafana实现

Vue 中嵌套 Grafana 的实现方法 使用 iframe 嵌入 Grafana 面板 在 Vue 项目中可以通过 iframe 直接嵌入 Grafana 的面板或仪表板。确保 Grafana 已…