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

在线脑图 vue 实现

在线脑图 Vue 实现方案 使用开源库实现 推荐使用 mind-elixir 或 jsmind 这类开源库,它们专为脑图设计且支持 Vue 集成。 安装依赖: npm install mi…

django vue实现

django vue实现

Django与Vue.js整合实现方案 Django作为后端框架与Vue.js作为前端框架的整合,可以通过以下方式实现: 分离式开发 前后端完全分离,Django仅提供API接口,Vue.js通过a…

vue实现radio

vue实现radio

Vue 实现 Radio 按钮 在 Vue 中实现 Radio 按钮可以通过 v-model 进行数据绑定,结合 input 元素的 type="radio" 属性。以下是一个基本示例: <t…

vue实现日历

vue实现日历

Vue 实现日历的基本方法 使用 Vue 实现日历可以通过自定义组件或借助第三方库完成。以下是两种常见实现方式: 自定义日历组件 创建基于 Vue 的日历组件需要处理日期计算和渲染逻辑。核心是生成当…

vue实现拖拉

vue实现拖拉

实现拖拽功能的基本步骤 在Vue中实现拖拽功能可以通过原生HTML5的拖放API或第三方库如vuedraggable完成。以下是两种方法的详细说明。 使用HTML5原生拖放API HTML5提供了原…

vue 实现$(id)

vue 实现$(id)

在 Vue 中实现类似 jQuery 的 $(id) 功能,可以通过以下几种方式操作 DOM 元素: 使用 ref 属性 Vue 推荐使用 ref 属性来直接访问 DOM 元素或组件实例。在模板中为…