当前位置:首页 > 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

vue实现mvvm

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

关键点总结

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

标签: vuemvvm
分享给朋友:

相关文章

vue的实现

vue的实现

Vue 的实现原理 Vue 是一个渐进式 JavaScript 框架,其核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是 Vue 实现的主要技术细节。 响应式系统 Vue 的响…

vue实现图片

vue实现图片

Vue 实现图片功能的方法 静态图片引入 在 Vue 项目中,可以通过 src 属性直接引入静态图片。图片通常放在 public 或 assets 目录下。 <template> &…

vue watch实现

vue watch实现

在 Vue 中实现 watch 监听数据变化 Vue 的 watch 选项用于监听数据变化并执行相应的回调函数。以下是几种常见的实现方式: 基础用法 export default { data(…

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

vue 实现聊天

vue 实现聊天

使用 Vue 实现聊天功能 创建 Vue 项目并安装依赖 确保已安装 Vue CLI,通过以下命令创建新项目: vue create chat-app 进入项目目录后,安装必要的依赖(如 Socke…

vue router实现分页

vue router实现分页

Vue Router 实现分页的方法 在 Vue.js 中,可以通过 Vue Router 实现分页功能,通常需要结合路由参数和动态路由匹配。以下是几种常见的实现方式: 使用查询参数实现分页 在路由…