当前位置:首页 > VUE

vue对mvvm的实现

2026-02-23 15:18:15VUE

Vue 的 MVVM 实现原理

Vue 通过数据绑定和响应式系统实现了 MVVM(Model-View-ViewModel)模式的核心思想。以下是 Vue 实现 MVVM 的关键机制:

数据劫持与响应式系统

Vue 使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)劫持数据对象的属性访问。当数据变化时,依赖该数据的视图会自动更新。

Vue 2 的响应式实现示例:

vue对mvvm的实现

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log(`读取 ${key}`);
      return val;
    },
    set(newVal) {
      console.log(`设置 ${key} 为 ${newVal}`);
      val = newVal;
      // 触发视图更新
    }
  });
}

虚拟 DOM 与 Diff 算法

Vue 通过虚拟 DOM 实现高效的视图更新。当数据变化时,Vue 会生成新的虚拟 DOM 树,通过 Diff 算法比较新旧树的差异,最终只更新真实 DOM 中需要变化的部分。

模板编译

Vue 模板会被编译成渲染函数。这个编译过程将模板中的指令和插值转换为可执行的 JavaScript 代码,建立数据与视图之间的绑定关系。

vue对mvvm的实现

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

<!-- 编译后的渲染函数 -->
function render() {
  return _c('div', [_v(_s(message))]);
}

依赖收集与派发更新

Vue 通过 Watcher 和 Dep 类实现依赖收集:

  • 每个响应式属性都有一个 Dep 实例
  • 当渲染函数执行时,会触发属性的 getter,将当前 Watcher 添加到 Dep 中
  • 当属性变化时,触发 setter,Dep 会通知所有 Watcher 更新

双向数据绑定实现

Vue 通过 v-model 指令实现双向绑定,本质上是语法糖:

<input v-model="message">

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

Vue 3 的改进

Vue 3 使用 Proxy 代替 Object.defineProperty,解决了 Vue 2 中无法检测数组和对象新增属性的限制。Proxy 可以拦截整个对象的所有操作,提供更完善的响应式支持。

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      track(target, key);
      return target[key];
    },
    set(target, key, value) {
      target[key] = value;
      trigger(target, key);
    }
  });
}

Vue 的 MVVM 实现通过以上机制,实现了数据与视图的自动同步,开发者只需关注数据逻辑,无需手动操作 DOM。

标签: vuemvvm
分享给朋友:

相关文章

拖拽式编程vue实现

拖拽式编程vue实现

拖拽式编程在 Vue 中的实现方法 使用 HTML5 原生拖放 API Vue 可以结合 HTML5 的拖放 API 实现基础拖拽功能。通过 draggable 属性标记可拖拽元素,监听 dragst…

vue实现关键词轮播

vue实现关键词轮播

Vue 实现关键词轮播 基础实现方案 使用 Vue 的 v-for 和 setInterval 实现基础轮播效果: <template> <div class="keywor…

vue实现右下角弹框

vue实现右下角弹框

实现右下角弹框的基本思路 在Vue中实现右下角弹框,通常需要结合CSS定位和Vue的组件化特性。弹框可以通过绝对定位固定在右下角,并通过Vue控制其显示与隐藏。 创建弹框组件 新建一个Vue组件(…

vue实现div

vue实现div

Vue 实现 DIV 元素的方法 在 Vue 中实现 DIV 元素可以通过多种方式,以下是几种常见的实现方法: 使用模板语法 在 Vue 的模板中直接使用 HTML 的 <div> 标签…

vue 实现拖拽

vue 实现拖拽

Vue 实现拖拽功能 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。 <template> &…

vue插槽实现

vue插槽实现

插槽的基本概念 Vue插槽(Slot)是一种内容分发机制,允许父组件向子组件传递模板片段,子组件通过<slot>标签定义接收位置。插槽的核心作用是增强组件的灵活性和复用性。 默认插槽…