当前位置:首页 > VUE

vue实现mvvm

2026-02-10 12:14:37VUE

Vue 的 MVVM 实现原理

Vue 通过数据劫持和发布-订阅模式实现 MVVM(Model-View-ViewModel)架构。核心在于数据绑定和响应式系统。

数据劫持(响应式系统)

Vue 使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)劫持数据对象的属性,监听数据变化。当数据被修改时,触发视图更新。

Vue 2 实现示例:

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      val = newVal;
      // 触发更新
      dep.notify();
    }
  });
}

Vue 3 实现示例:

const reactive = (target) => {
  return new Proxy(target, {
    get(target, key) {
      return Reflect.get(target, key);
    },
    set(target, key, value) {
      Reflect.set(target, key, value);
      // 触发更新
      trigger(target, key);
      return true;
    }
  });
};

依赖收集(发布-订阅模式)

每个响应式属性有一个依赖收集器(Dep),用于存储依赖该属性的 Watcher(订阅者)。当数据变化时,Dep 通知所有 Watcher 更新视图。

class Dep {
  constructor() {
    this.subs = [];
  }
  addSub(sub) {
    this.subs.push(sub);
  }
  notify() {
    this.subs.forEach(sub => sub.update());
  }
}

class Watcher {
  update() {
    // 更新视图
    patch();
  }
}

模板编译

Vue 将模板编译为渲染函数,生成虚拟 DOM(VNode)。通过对比新旧 VNode,高效更新真实 DOM。

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

// 编译为渲染函数
function render() {
  return h('div', this.message);
}

双向数据绑定

通过 v-model 实现表单元素与数据的双向绑定,本质是语法糖,结合 :value@input

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

关键点总结

  • 数据劫持:通过 Object.definePropertyProxy 监听数据变化。
  • 依赖收集:每个属性维护一个 Dep,收集依赖的 Watcher。
  • 模板编译:将模板转为渲染函数,生成 VNode。
  • 虚拟 DOM:通过 Diff 算法高效更新视图。
  • 双向绑定v-model 简化表单数据同步。

vue实现mvvm

标签: vuemvvm
分享给朋友:

相关文章

vue实现按钮组轮换

vue实现按钮组轮换

实现按钮组轮换的方法 在Vue中实现按钮组轮换效果可以通过动态绑定类和事件处理来完成。以下是一种常见的实现方式: 模板部分 <template> <div class="bu…

vue怎么实现

vue怎么实现

Vue 实现方法 Vue 是一个流行的前端框架,用于构建用户界面。以下是几种常见的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。 <input v-m…

vue实现类别

vue实现类别

Vue 实现类别的几种方法 在 Vue 中实现类别功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-bind:class 动态绑定类名 通过对象语法或数组语法动态绑定类名,根据条件添加或移…

vue实现剪辑

vue实现剪辑

Vue 实现视频剪辑功能 在Vue中实现视频剪辑功能通常需要结合HTML5的<video>元素和第三方库(如FFmpeg.js或Video.js)。以下是几种常见的实现方法: 使用FFm…

vue实现异步

vue实现异步

Vue 实现异步操作的常见方法 Vue 提供了多种方式来处理异步操作,包括数据获取、事件处理等场景。 使用 async/await 在 Vue 方法中可以直接使用 async/await 语法处理…

jquery实现vue

jquery实现vue

jQuery 和 Vue.js 是两种不同理念的前端工具,jQuery 以 DOM 操作和事件驱动为核心,而 Vue.js 是数据驱动的现代化框架。如果想用 jQuery 实现类似 Vue 的功能(如…