当前位置:首页 > VUE

vue如何实现mvvm

2026-02-10 18:58:43VUE

Vue 的 MVVM 实现原理

Vue 通过数据绑定和响应式系统实现 MVVM(Model-View-ViewModel)模式。核心机制包括数据劫持、依赖收集和派发更新。

数据劫持

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

// Vue 2 的数据劫持示例
const data = { msg: 'Hello' };
Object.defineProperty(data, 'msg', {
  get() { return value; },
  set(newVal) {
    value = newVal;
    notifyUpdate(); // 触发更新
  }
});

依赖收集

每个组件实例对应一个 Watcher 实例。在渲染过程中,访问数据属性会触发 getter,将当前 Watcher 添加到依赖列表(Dep)中。

class Dep {
  constructor() {
    this.subs = []; // 存储 Watcher
  }
  depend() {
    if (Watcher.target) {
      this.subs.push(Watcher.target);
    }
  }
  notify() {
    this.subs.forEach(watcher => watcher.update());
  }
}

虚拟 DOM 与更新

Vue 将模板编译为渲染函数,生成虚拟 DOM。数据变化时,Watcher 触发重新渲染,通过 Diff 算法比对新旧虚拟 DOM,高效更新真实 DOM。

// 简化的渲染流程
function updateComponent() {
  const vnode = render(); // 生成虚拟 DOM
  patch(oldVnode, vnode); // 差异更新
}

关键模块分工

  • Model:普通 JavaScript 对象,存储业务数据。
  • View:模板或渲染函数,声明式描述 UI。
  • ViewModel:Vue 实例,桥接 Model 和 View,处理数据绑定和交互逻辑。

双向绑定示例

通过 v-model 指令实现表单输入与数据的双向绑定:

vue如何实现mvvm

<input v-model="message">
<p>{{ message }}</p>
new Vue({
  data: { message: '' } // 数据变化自动更新视图,输入修改自动同步数据
});

与传统 MVC 的区别

  • MVC:手动操作 DOM,需直接监听事件并更新视图。
  • MVVM:数据驱动视图,开发者只需关注数据状态,框架自动处理 DOM 更新。

Vue 的 MVVM 实现通过响应式系统和虚拟 DOM 技术,降低了直接操作 DOM 的复杂度,提升了开发效率。

标签: 如何实现vue
分享给朋友:

相关文章

vue实现视窗

vue实现视窗

Vue 实现视窗功能 在 Vue 中实现视窗功能通常涉及监听浏览器窗口大小变化、响应式布局或创建自定义弹窗组件。以下是几种常见实现方式: 监听浏览器窗口大小变化 使用 Vue 的 mounted 和…

vue实现fadein

vue实现fadein

Vue 实现 FadeIn 效果 在 Vue 中实现淡入(FadeIn)效果可以通过 CSS 过渡、动画或第三方库实现。以下是几种常见方法: 使用 CSS 过渡 通过 Vue 的过渡系统结合 CSS…

vue实现浮标

vue实现浮标

Vue 实现浮动按钮(浮标) 使用 Vue 实现浮动按钮可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 定位和 Vue 组件 创建 Vue 组件并配合 CSS 固定定位实现浮动按钮:…

vue 实现遮罩

vue 实现遮罩

Vue 实现遮罩层的方法 使用固定定位和透明背景 在Vue中实现遮罩层可以通过CSS固定定位结合透明背景色完成。创建一个全屏遮罩组件,利用position: fixed覆盖整个视窗。 <tem…

vue实现音乐

vue实现音乐

Vue实现音乐播放功能 使用Vue实现音乐播放功能可以通过多种方式完成,以下是几种常见的实现方法: 使用HTML5 Audio API 在Vue组件中直接使用HTML5的Audio对象来控制音乐播放…

用vue实现全选

用vue实现全选

实现全选功能的基本思路 在Vue中实现全选功能通常涉及以下核心逻辑:通过一个布尔值控制全选状态,遍历子选项并同步其选中状态。以下是具体实现方法。 使用v-model绑定全选状态 在模板中,使用v-m…