当前位置:首页 > 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 如何实现mvvm的

// 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。

vue 如何实现mvvm的

// 虚拟 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
分享给朋友:

相关文章

vue实现水印

vue实现水印

Vue 实现水印的方法 使用 CSS 背景图 通过 CSS 的 background-image 和 background-repeat 属性实现水印效果。创建一个包含水印文本的 Canvas,将其转…

vue实现左右拉伸

vue实现左右拉伸

实现左右拉伸布局的方法 使用CSS Flexbox布局 Flexbox可以轻松实现左右拉伸的效果。通过设置display: flex和flex-grow属性,可以让元素填充可用空间。 <div…

vue实现抽奖轮盘

vue实现抽奖轮盘

实现抽奖轮盘的基本思路 使用Vue实现抽奖轮盘的核心在于动态旋转动画和结果判定。通常需要结合CSS动画或JavaScript动画库(如GSAP)控制轮盘的旋转角度,并通过随机数或后端接口确定最终奖项。…

vue打包实现推送

vue打包实现推送

Vue 项目打包与自动化部署推送 打包 Vue 项目 使用以下命令生成生产环境代码,默认输出到 dist 目录: npm run build 配置自动化推送(以 GitHub Pages 为例)…

vue歌词滚动实现

vue歌词滚动实现

实现 Vue 歌词滚动的核心方法 监听当前播放时间 通过 audio 元素的 timeupdate 事件获取当前播放时间,并与歌词时间戳对比。在 Vue 中使用 @timeupdate 绑定事件:…

vue实现搜索过滤

vue实现搜索过滤

Vue 实现搜索过滤 使用计算属性实现搜索过滤 在 Vue 中,计算属性(computed)是实现搜索过滤的常见方法。通过计算属性动态过滤数据,无需修改原始数据。 <template>…