当前位置:首页 > VUE

vue实现mvvm原理

2026-01-19 12:08:32VUE

Vue 实现 MVVM 的原理

Vue 的 MVVM(Model-View-ViewModel)实现主要依赖于数据绑定和响应式系统。以下是其核心原理的详细解析:

数据劫持(响应式系统)

Vue 通过 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)劫持数据的访问和修改。当数据发生变化时,能够自动触发视图更新。

  • Vue 2.x

    Object.defineProperty(obj, key, {
      get() {
        return value;
      },
      set(newVal) {
        if (newVal !== value) {
          value = newVal;
          dep.notify(); // 通知依赖更新
        }
      }
    });
  • Vue 3.x

    vue实现mvvm原理

    const proxy = new Proxy(obj, {
      get(target, key) {
        return Reflect.get(target, key);
      },
      set(target, key, value) {
        Reflect.set(target, key, value);
        trigger(target, key); // 触发更新
      }
    });

依赖收集

Vue 在编译模板时,会为每个响应式数据创建一个 Dep(依赖管理器)。当数据被访问时,当前 Watcher(观察者)会被添加到 Dep 中。

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

虚拟 DOM 与 Diff 算法

Vue 通过虚拟 DOM 优化渲染性能。当数据变化时,生成新的虚拟 DOM,并通过 Diff 算法对比新旧虚拟 DOM,仅更新必要的部分。

function patch(oldVnode, vnode) {
  if (sameVnode(oldVnode, vnode)) {
    patchVnode(oldVnode, vnode);
  } else {
    replaceNode(oldVnode, vnode);
  }
}

模板编译

Vue 将模板编译为渲染函数。模板中的指令(如 v-modelv-for)会被解析为对应的 JavaScript 代码。

vue实现mvvm原理

  • 示例模板

    <div v-if="show">{{ message }}</div>
  • 编译结果

    function render() {
      return show ? createElement('div', message) : null;
    }

双向数据绑定

v-model 是语法糖,结合 :value@input 实现双向绑定。

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

总结

Vue 的 MVVM 实现通过数据劫持、依赖收集、虚拟 DOM 和模板编译等技术,实现了数据与视图的自动同步。Vue 3.x 引入 Proxy 进一步优化了响应式系统的性能和功能。

标签: 原理vue
分享给朋友:

相关文章

vue实现https

vue实现https

Vue 中实现 HTTPS 的步骤 在 Vue 项目中实现 HTTPS 主要涉及开发环境配置和生产环境部署。以下是具体方法: 开发环境配置(Vue CLI 或 Vite) 使用 mkcert…

vue tag实现

vue tag实现

Vue 标签实现方法 在 Vue 中实现标签功能可以通过多种方式完成,常见场景包括动态标签生成、标签输入框、标签管理等。以下是几种典型实现方案: 动态标签列表渲染 使用 v-for 指令渲染标签…

vue分类实现

vue分类实现

Vue分类实现方法 在Vue中实现分类功能通常涉及数据分组、动态渲染和交互逻辑。以下是几种常见的实现方式: 基于计算属性的分类 通过计算属性对原始数据进行分组处理,适合静态或少量数据分类: com…

vue实现批量

vue实现批量

Vue 实现批量操作的方法 在 Vue 中实现批量操作通常涉及选择多个项目并执行统一处理,例如批量删除、批量更新等。以下是几种常见实现方式: 表格多选批量操作 使用 el-table 配合复选框实…

vue实现动态

vue实现动态

Vue 实现动态路由的方法 在 Vue 中实现动态路由通常涉及以下几个关键步骤: 使用 Vue Router 的动态路由匹配 通过 Vue Router 的 :param 语法可以实现动态路由匹配。…

vue 实现列表

vue 实现列表

Vue 实现列表的方法 在 Vue 中实现列表通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式: 基础列表渲染 使用 v-for 指令遍历数组,渲染列表项。it…