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

vue实现评论编辑

Vue 实现评论编辑功能 数据绑定与表单结构 使用 v-model 双向绑定评论内容到表单输入框,确保编辑时能显示原内容并同步修改。示例模板结构: <template> <d…

vue实现选择季度

vue实现选择季度

Vue 实现选择季度的几种方法 使用下拉选择框(Select) 在 Vue 中可以通过 v-model 绑定一个下拉选择框来实现季度选择。数据可以预先定义为一个包含季度选项的数组。 <tem…

vue实现压缩上传文件

vue实现压缩上传文件

压缩上传文件的实现方法 在Vue中实现文件压缩和上传功能,可以通过以下步骤完成。该方法结合了前端文件压缩库和HTTP请求,确保文件在上传前被有效压缩。 安装必要的依赖 需要使用compressor…

在线脑图 vue 实现

在线脑图 vue 实现

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

vue实现按卡片轮播

vue实现按卡片轮播

实现卡片轮播的基本思路 在Vue中实现卡片轮播可以通过结合v-for指令和动态样式绑定完成。核心是维护一个当前显示卡片的索引,通过CSS过渡效果实现平滑切换。 基础实现步骤 模板部分 使用v-for…

vue实现关键词轮播

vue实现关键词轮播

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