当前位置:首页 > VUE

vue实现mvvm

2026-03-27 22:00:21VUE

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() {
      console.log(`读取 ${key}`);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log(`设置 ${key} 为 ${newVal}`);
        val = newVal;
      }
    }
  });
}

依赖收集与观察者模式

每个响应式属性关联一个 Dep(依赖收集器),用于存储依赖该属性的 Watcher(观察者)。当属性被访问时,当前 Watcher 会被添加到 Dep 中。

vue实现mvvm

class Dep {
  constructor() {
    this.subscribers = [];
  }
  depend() {
    if (target && !this.subscribers.includes(target)) {
      this.subscribers.push(target);
    }
  }
  notify() {
    this.subscribers.forEach(sub => sub());
  }
}

虚拟 DOM 与差异更新

Vue 通过虚拟 DOM 优化渲染性能。当数据变化时,生成新的虚拟 DOM 并与旧虚拟 DOM 进行差异比对(diff 算法),仅更新必要的真实 DOM 节点。

// 简化的虚拟 DOM 结构
{
  tag: 'div',
  props: { id: 'app' },
  children: [
    { tag: 'span', props: {}, children: ['Hello'] }
  ]
}

模板编译

Vue 模板会被编译为渲染函数。指令(如 v-model)会被解析为对应的数据绑定和事件监听代码。

vue实现mvvm

// v-model 的编译结果示例
<input v-model="message">
// 编译为:
h('input', {
  domProps: { value: this.message },
  on: { input: e => this.message = e.target.value }
})

组件系统

Vue 组件是 MVVM 的 ViewModel 层,管理自身的数据、方法和生命周期。组件间通过 props(父传子)和 $emit(子传父)通信。

Vue.component('child', {
  props: ['msg'],
  template: `<div @click="$emit('reply', 'Hi')">{{ msg }}</div>`
});

生命周期钩子

Vue 提供生命周期钩子(如 createdmounted)让开发者在特定阶段执行逻辑。这些钩子对应 MVVM 中 ViewModel 的初始化、挂载和销毁过程。

new Vue({
  created() {
    console.log('实例创建完成');
  },
  mounted() {
    console.log('DOM 挂载完成');
  }
});

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

标签: vuemvvm
分享给朋友:

相关文章

vue 路由实现

vue 路由实现

Vue 路由实现方法 安装 Vue Router 使用 npm 或 yarn 安装 Vue Router 依赖包: npm install vue-router # 或 yarn add vue-r…

前端多线程实现vue

前端多线程实现vue

前端多线程与Vue的结合 在Vue中实现多线程通常通过Web Worker技术完成。Web Worker允许在后台线程中运行脚本,避免阻塞主线程,适合处理计算密集型任务。 使用Web Worker的…

antd vue 实现

antd vue 实现

使用 Ant Design Vue 实现功能 Ant Design Vue 是基于 Vue.js 的 UI 组件库,提供了丰富的组件和设计规范。以下是一些常见功能的实现方法。 安装 Ant Desi…

vue实现ppt

vue实现ppt

Vue 实现 PPT 的功能 Vue 可以结合第三方库或自定义组件实现类似 PPT 的演示效果。以下是几种常见的方法: 使用第三方库 reveal.js reveal.js 是一个流行的演示框架,支…

vue底部实现

vue底部实现

Vue 底部实现方法 在 Vue 项目中实现底部布局可以通过多种方式完成,以下是一些常见的方法: 使用固定定位 将底部元素固定在页面底部,适用于单页应用或需要始终显示的底部栏。 <temp…

不用vue实现spa

不用vue实现spa

使用原生 JavaScript 实现 SPA 通过监听 URL 变化动态加载内容,结合 history.pushState 或 hashchange 事件实现路由切换。 // 路由配置 const…