当前位置:首页 > VUE

vue怎样实现mvvm

2026-01-14 02:47:08VUE

Vue 实现 MVVM 的模式

Vue 通过数据绑定和响应式系统实现 MVVM(Model-View-ViewModel)架构。以下是核心实现机制:

数据绑定与响应式系统

Vue 使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)劫持数据对象的属性访问。当数据变化时,触发依赖收集的 Watcher 更新视图。

// Vue 2 响应式简化示例
function defineReactive(obj, key) {
  let value = obj[key];
  const dep = new Dep(); // 依赖收集器

  Object.defineProperty(obj, key, {
    get() {
      dep.depend(); // 收集当前依赖
      return value;
    },
    set(newVal) {
      if (newVal !== value) {
        value = newVal;
        dep.notify(); // 通知更新
      }
    }
  });
}

虚拟 DOM 与 Diff 算法

Vue 将模板编译为虚拟 DOM,通过 Diff 算法比对变化后生成最小化 DOM 操作,高效更新视图。

vue怎样实现mvvm

// 虚拟 DOM 结构示例
{
  tag: 'div',
  attrs: { id: 'app' },
  children: [
    { tag: 'span', text: 'Hello Vue' }
  ]
}

模板编译

Vue 模板通过编译器转换为渲染函数。例如以下模板:

<div>{{ message }}</div>

会被编译为类似以下的渲染函数:

vue怎样实现mvvm

function render() {
  return _c('div', [_v(_s(message))]);
}

依赖收集与派发更新

  • 依赖收集:在渲染过程中,触发数据的 getter 将 Watcher 添加到依赖列表。
  • 派发更新:数据变化时触发 setter,通知所有 Watcher 执行更新。

MVVM 各层对应关系

  • Model:Vue 的 data 对象,代表业务数据。
  • View:模板或渲染函数生成的 DOM 结构。
  • ViewModel:Vue 实例,负责同步 Model 和 View,处理事件绑定等逻辑。

双向绑定实现

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

<input v-model="message">

等价于:

<input 
  :value="message" 
  @input="message = $event.target.value">

标签: vuemvvm
分享给朋友:

相关文章

vue实现路由导航

vue实现路由导航

路由导航的实现方式 在Vue中,路由导航主要通过Vue Router实现。Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。 基本路由配置 安装Vue Router后…

vue实现数组

vue实现数组

Vue 实现数组操作的方法 在 Vue 中,数组的操作需要特别注意响应式的问题。Vue 提供了一些方法来确保数组的变动能够触发视图更新。 响应式数组方法 Vue 对以下数组方法进行了封装,确保它们能…

vue实现watch

vue实现watch

监听数据变化 在Vue中,watch用于监听响应式数据的变化并执行回调函数。基本语法如下: watch: { propertyName(newValue, oldValue) { //…

vue实现word文档实现预览

vue实现word文档实现预览

在Vue中实现Word文档预览可以通过多种方式实现,以下是几种常见的方法: 使用mammoth.js库 mammoth.js是一个将Word文档(.docx)转换为HTML的JavaScript库,…

vue实现搜索查询

vue实现搜索查询

Vue 实现搜索查询的方法 双向绑定实现实时搜索 在Vue中可以通过v-model绑定输入框的值,结合计算属性或watch监听输入变化实现实时搜索。 <template> <i…

vue实现文章滚动

vue实现文章滚动

Vue 实现文章滚动效果 使用 CSS 实现基础滚动 通过 CSS 的 overflow 和 height 属性控制滚动区域,适用于静态内容滚动。在 Vue 模板中定义固定高度的容器,内容超出后自动滚…