当前位置:首页 > VUE

vue mvvm的实现

2026-01-17 09:22:22VUE

Vue MVVM 的实现原理

Vue 的 MVVM(Model-View-ViewModel)模式通过数据绑定和响应式系统实现视图与数据的自动同步。以下是核心实现机制:

数据劫持(响应式核心)

Vue 使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)劫持数据对象的属性访问。当数据变化时,触发依赖更新。

Vue 2 示例:

Object.defineProperty(obj, key, {
  get() {
    // 收集依赖
    return val;
  },
  set(newVal) {
    // 触发更新
    val = newVal;
  }
});

Vue 3 示例:

new Proxy(data, {
  get(target, key) {
    // 收集依赖
    return Reflect.get(target, key);
  },
  set(target, key, value) {
    // 触发更新
    return Reflect.set(target, key, value);
  }
});

依赖收集与派发更新

  • 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() {
    // 触发组件重新渲染
  }
}

虚拟 DOM 与 Diff 算法

Vue 通过虚拟 DOM 优化渲染性能:

  1. 将模板编译为渲染函数,生成虚拟 DOM。
  2. 数据变化时,对比新旧虚拟 DOM(Diff 算法),最小化 DOM 操作。
// 简化的 Diff 示例
function patch(oldVnode, newVnode) {
  if (sameVnode(oldVnode, newVnode)) {
    // 复用节点并更新差异
  } else {
    // 替换节点
  }
}

模板编译

Vue 将模板编译为渲染函数:

  1. 解析:将模板转换为 AST(抽象语法树)。
  2. 优化:标记静态节点。
  3. 生成代码:将 AST 转换为可执行的渲染函数。
// 编译结果示例
function render() {
  with(this) {
    return _c('div', { attrs: { "id": "app" } }, [_v("Hello " + _s(name))]);
  }
}

双向数据绑定(v-model)

v-model 是语法糖,结合 :value@input 实现:

vue mvvm的实现

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

关键设计思想

  • 数据驱动:视图变化由数据变化自动触发。
  • 组件化:每个组件实例对应一个 Watcher,实现局部更新。
  • 异步更新队列:同一事件循环内的数据变化合并为一次更新。

标签: vuemvvm
分享给朋友:

相关文章

vue SSG实现

vue SSG实现

Vue SSG 实现方法 Vue 的静态站点生成(SSG)可以通过多种工具和框架实现,以下是几种常见的方法: 使用 VuePress VuePress 是一个基于 Vue 的静态站点生成器,适合文档…

vue 实现筛选

vue 实现筛选

实现筛选功能的基本方法 在Vue中实现筛选功能通常涉及以下几个核心步骤: 数据绑定与筛选逻辑 使用v-model绑定筛选条件到Vue实例的数据属性,结合计算属性实现动态筛选: data() {…

vue如何实现

vue如何实现

Vue 实现方法 在 Vue 中实现功能通常涉及组件化开发、状态管理和响应式数据绑定。以下是几种常见的实现方式: 组件化开发 使用 Vue 的单文件组件(.vue 文件)结构,将 UI 拆分为可复用…

vue实现拖动

vue实现拖动

Vue实现拖动的常用方法 在Vue中实现拖动功能通常需要结合HTML5的拖放API或第三方库。以下是几种常见实现方式: 使用HTML5原生拖放API HTML5提供了原生拖放API,可以通过drag…

vue 实现拖拉

vue 实现拖拉

Vue 实现拖拽功能的方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…

vue 实现滑动

vue 实现滑动

Vue 实现滑动效果的方法 在Vue中实现滑动效果可以通过多种方式,以下是几种常见的方法: 使用CSS过渡和动画 通过Vue的<transition>组件结合CSS过渡或动画实现滑动效果…