当前位置:首页 > VUE

vue怎样实现mvvm

2026-01-08 05:11:45VUE

Vue 实现 MVVM 的原理

Vue 的 MVVM(Model-View-ViewModel)模式通过数据绑定和响应式系统实现视图与数据的自动同步。以下是 Vue 实现 MVVM 的核心机制:

数据劫持(响应式系统)

Vue 使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)劫持数据的读写操作。当数据变化时,触发依赖的视图更新。

// Vue 2 的数据劫持示例
const data = { name: 'Vue' };
Object.defineProperty(data, 'name', {
  get() {
    console.log('读取数据');
    return value;
  },
  set(newVal) {
    console.log('更新数据');
    value = newVal;
    updateView(); // 触发视图更新
  }
});

依赖收集

通过 Dep(依赖管理器)和 Watcher(观察者)实现依赖跟踪。每个响应式属性有一个 Dep 实例,当属性被访问时,当前 Watcher 会被记录到 Dep 中。

class Dep {
  constructor() {
    this.subscribers = [];
  }
  depend() {
    if (target && !this.subscribers.includes(target)) {
      this.subscribers.push(target);
    }
  }
  notify() {
    this.subscribers.forEach(sub => sub());
  }
}

模板编译

Vue 将模板编译为渲染函数,解析指令(如 v-model)和插值表达式({{}}),建立数据与 DOM 的绑定关系。

// 示例:v-model 双向绑定实现
<input v-model="message">
// 编译后等效于
<input :value="message" @input="message = $event.target.value">

虚拟 DOM

通过虚拟 DOM 比对(Diff 算法)最小化真实 DOM 操作。数据变化时生成新的虚拟 DOM,与旧节点对比后局部更新视图。

// 简化的虚拟 DOM 结构
const vnode = {
  tag: 'div',
  props: { id: 'app' },
  children: [
    { tag: 'span', text: this.message }
  ]
};

MVVM 各层职责

  • Model:普通 JavaScript 对象,如 Vue 的 data
  • View:模板或渲染函数生成的 DOM。
  • ViewModel:Vue 实例,负责数据绑定、事件监听等桥梁作用。

通过以上机制,Vue 实现了数据变化自动驱动视图更新(数据绑定),以及视图交互反向修改数据(双向绑定)的 MVVM 模式。

vue怎样实现mvvm

标签: vuemvvm
分享给朋友:

相关文章

vue实现新闻

vue实现新闻

Vue 实现新闻功能 使用 Vue 实现新闻功能通常涉及新闻列表展示、新闻详情页、分类筛选等模块。以下是实现的基本思路和代码示例。 新闻列表展示 通过 Vue 组件展示新闻列表,通常使用 v-fo…

vue实现节流

vue实现节流

vue实现节流的方法 在Vue中实现节流(throttle)功能,通常用于限制高频事件的触发频率,例如滚动、输入或按钮点击。以下是几种常见的实现方式: 使用Lodash的throttle函数 安装…

vue实现groupbox

vue实现groupbox

Vue 实现 GroupBox 组件 在 Vue 中实现类似 GroupBox 的效果可以通过自定义组件完成。GroupBox 通常是一个带有标题的边框容器,用于将相关控件分组显示。 基本实现方法…

vue实现筛选

vue实现筛选

实现筛选功能的基本思路 在Vue中实现筛选功能通常需要结合数据绑定、计算属性和方法。筛选的核心逻辑是根据用户输入的条件过滤原始数据列表,并动态更新显示结果。 数据准备 定义一个数组存储原始数据,另…

vue jwt实现

vue jwt实现

Vue JWT 实现方法 安装依赖 确保项目中安装了 jsonwebtoken(后端)和 axios(前端)。若使用 Vue 3,可搭配 vue-router 和 pinia(或 vuex)管理状态。…

vue最佳实现

vue最佳实现

Vue 最佳实践 组件设计 组件应遵循单一职责原则,每个组件只负责一个功能模块。命名采用 PascalCase(如 UserProfile.vue),模板中使用 kebab-case(如 <us…