当前位置:首页 > VUE

vue 如何实现mvvm的

2026-02-24 05:18:27VUE

Vue 的 MVVM 实现原理

Vue 通过数据绑定、响应式系统和虚拟 DOM 等技术实现 MVVM(Model-View-ViewModel)模式。以下是核心实现机制:

数据劫持与响应式系统

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

Vue 2 示例:

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

Vue 3 的 Proxy:

const proxy = new Proxy(data, {
  get(target, key) { track(target, key); return target[key]; },
  set(target, key, value) {
    target[key] = value;
    trigger(target, key); // 触发更新
  }
});

依赖收集与发布订阅

每个响应式属性关联一个 Dep(依赖收集器),Watcher(观察者)在渲染过程中订阅依赖。数据变化时,Dep 通知所有 Watcher 更新视图。

vue 如何实现mvvm的

依赖收集流程:

  1. 组件渲染时触发 getter,将当前 Watcher 添加到 Dep 中。
  2. 数据修改时触发 setterDep 通知所有 Watcher 执行更新。

虚拟 DOM 与 Diff 算法

Vue 将模板编译为虚拟 DOM(VNode),通过 Diff 算法比对变化,最小化真实 DOM 操作。

Patch 过程:

vue 如何实现mvvm的

function patch(oldVnode, newVnode) {
  if (sameVnode(oldVnode, newVnode)) {
    patchVnode(oldVnode, newVnode); // 精细化比对子节点
  } else {
    replaceNode(oldVnode, newVnode); // 直接替换
  }
}

模板编译

Vue 将模板编译为渲染函数,生成虚拟 DOM:

  1. 解析:将模板转换为 AST(抽象语法树)。
  2. 优化:标记静态节点,跳过 Diff。
  3. 生成代码:将 AST 转换为可执行的渲染函数。

示例输出:

with(this) {
  return _c('div', { attrs: { id: 'app' } }, [_v("Hello " + _s(name))]);
}

双向数据绑定

通过 v-model 指令实现表单元素与数据的双向绑定,本质是语法糖:

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

总结

Vue 的 MVVM 实现核心:

  • Model:普通 JavaScript 对象,通过响应式系统监听变化。
  • View:模板或渲染函数生成的虚拟 DOM。
  • ViewModel:Vue 实例,负责数据与视图的同步,通过响应式机制、虚拟 DOM 和模板编译实现解耦。

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

相关文章

vue怎么实现页面返回

vue怎么实现页面返回

Vue 实现页面返回的方法 在 Vue 中实现页面返回功能,可以通过以下几种方式完成,具体取决于项目使用的路由模式和技术栈。 使用 Vue Router 的编程式导航 通过 this.$router…

vue列表实现

vue列表实现

Vue 列表实现方法 使用 v-for 指令 v-for 是 Vue 中用于渲染列表的核心指令,基于数据源动态生成 DOM 元素。语法格式为 item in items 或 (item, index)…

vue 实现级联

vue 实现级联

Vue 实现级联选择器 级联选择器(Cascader)常用于省市区选择、分类选择等场景。Vue 中可以通过 Element UI、Ant Design Vue 等 UI 库实现,也可以手动封装。 使…

vue实现单据

vue实现单据

Vue 实现单据功能的方法 使用 Vue 实现单据功能通常涉及表单设计、数据绑定、验证和提交等环节。以下是具体实现方案: 表单设计与数据绑定 使用 Vue 的 v-model 指令实现表单数据的双向…

vue翻页实现

vue翻页实现

Vue翻页实现方法 基础分页组件实现 使用v-for和计算属性实现基础分页逻辑: <template> <div> <ul> <li…

vue nexttrick实现

vue nexttrick实现

Vue 中 nextTick 的实现原理 nextTick 是 Vue 提供的一个异步方法,用于在下次 DOM 更新循环结束之后执行延迟回调。它利用了 JavaScript 的事件循环机制,确保回调在…