当前位置:首页 > VUE

vue 如何实现mvvm的

2026-01-23 14:41:28VUE

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('获取值');
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log('设置值');
        val = newVal;
        // 触发更新
      }
    }
  });
}

依赖收集与发布订阅

通过 Dep(依赖管理器)和 Watcher(观察者)实现依赖的收集和通知。每个响应式属性有一个 Dep 实例,用于存储依赖它的 Watcher

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

虚拟 DOM 与 Diff 算法

Vue 将模板编译为虚拟 DOM(VNode),通过 Diff 算法比对变化,最小化 DOM 操作。当数据变化时,生成新的 VNode 并与旧 VNode 对比,高效更新真实 DOM。

// 虚拟 DOM 简化结构
const vnode = {
  tag: 'div',
  props: { class: 'container' },
  children: [
    { tag: 'p', text: 'Hello Vue' }
  ]
};

模板编译

Vue 的模板通过编译器转换为渲染函数。例如以下模板:

<div>{{ message }}</div>

会被编译为类似以下的渲染函数:

function render() {
  return _c('div', [_v(_s(message))]);
}

实现流程

  1. 初始化阶段:通过 new Vue() 创建实例,初始化数据、方法、生命周期等。
  2. 模板编译:将模板转换为渲染函数(如果是运行时编译版本)。
  3. 响应式处理:对 data 中的属性进行劫持,建立 DepWatcher 的关联。
  4. 首次渲染:执行渲染函数生成 VNode,并挂载为真实 DOM。
  5. 更新阶段:数据变化时触发 setter,通知 Watcher 重新渲染,通过 Diff 算法更新 DOM。

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

vue 如何实现mvvm的

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

相关文章

vue实现按钮组轮换

vue实现按钮组轮换

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

vue实现关键词轮播

vue实现关键词轮播

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

代码实现vue

代码实现vue

创建Vue项目 使用Vue CLI快速初始化项目,确保已安装Node.js和npm/yarn: npm install -g @vue/cli vue create my-vue-project…

vue router 实现

vue router 实现

Vue Router 的实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的核心实现方式。 安装 Vue Router 通…

vue实现图册

vue实现图册

Vue实现图册功能 在Vue中实现图册功能通常涉及图片展示、切换、缩放等交互效果。以下是常见的实现方法和关键代码示例: 基础图册组件结构 使用Vue单文件组件构建基础结构: <templ…

vue grid实现

vue grid实现

Vue Grid 实现方法 在 Vue 中实现网格布局可以通过多种方式完成,包括使用原生 CSS Grid、第三方组件库或自定义组件。以下是几种常见方法: 使用原生 CSS Grid 通过 Vue…