当前位置:首页 > VUE

vue vm实现原理

2026-01-19 13:36:23VUE

Vue VM 实现原理

Vue 的 ViewModel(VM)实现原理主要基于数据劫持和依赖收集,通过响应式系统实现数据和视图的自动同步。

数据劫持

Vue 使用 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)对数据进行劫持。当数据被访问或修改时,能够触发相应的 getter 和 setter 函数。

// Vue 2.x 数据劫持示例
const data = { name: 'Vue' };
Object.defineProperty(data, 'name', {
  get() {
    console.log('获取 name');
    return this._name;
  },
  set(newVal) {
    console.log('设置 name');
    this._name = newVal;
  }
});

依赖收集

Vue 通过依赖收集跟踪数据的依赖关系。每个响应式数据属性都有一个对应的 Dep 实例,用于存储依赖该数据的 Watcher 实例。

vue vm实现原理

class Dep {
  constructor() {
    this.subscribers = [];
  }
  depend() {
    if (target && !this.subscribers.includes(target)) {
      this.subscribers.push(target);
    }
  }
  notify() {
    this.subscribers.forEach(sub => sub());
  }
}

观察者模式

Vue 使用 Watcher 实例作为观察者,负责在数据变化时更新视图。每个组件实例对应一个 Watcher,当数据变化时,Watcher 会触发重新渲染。

class Watcher {
  constructor(vm, expOrFn, cb) {
    this.vm = vm;
    this.getter = parsePath(expOrFn);
    this.cb = cb;
    this.value = this.get();
  }
  get() {
    target = this;
    const value = this.getter.call(this.vm, this.vm);
    target = undefined;
    return value;
  }
  update() {
    const oldValue = this.value;
    this.value = this.get();
    this.cb.call(this.vm, this.value, oldValue);
  }
}

虚拟 DOM

Vue 使用虚拟 DOM 提高渲染效率。当数据变化时,Vue 会生成新的虚拟 DOM 树,并通过 diff 算法比较新旧虚拟 DOM,最终只更新必要的真实 DOM。

vue vm实现原理

function patch(oldVnode, vnode) {
  if (sameVnode(oldVnode, vnode)) {
    patchVnode(oldVnode, vnode);
  } else {
    const parent = oldVnode.parentNode;
    const elm = createElm(vnode);
    parent.insertBefore(elm, oldVnode);
    parent.removeChild(oldVnode);
  }
  return vnode.elm;
}

模板编译

Vue 将模板编译为渲染函数。模板中的指令和插值表达式会被转换为 JavaScript 代码,生成虚拟 DOM。

// 模板
<div>{{ message }}</div>

// 编译后的渲染函数
function render() {
  with(this) {
    return _c('div', [_v(_s(message))]);
  }
}

组件系统

Vue 的组件系统基于原型继承。每个组件实例继承自 Vue 原型,拥有独立的响应式数据、计算属性、方法等。

const Sub = function VueComponent(options) {
  this._init(options);
};
Sub.prototype = Object.create(Vue.prototype);
Sub.prototype.constructor = Sub;

生命周期钩子

Vue 在组件创建和更新的不同阶段调用生命周期钩子函数。这些钩子允许开发者在特定时机执行自定义逻辑。

function callHook(vm, hook) {
  const handlers = vm.$options[hook];
  if (handlers) {
    handlers.call(vm);
  }
}

总结

Vue 的 VM 实现通过数据劫持、依赖收集、观察者模式、虚拟 DOM 等技术,实现了数据和视图的自动同步。这种响应式系统是 Vue 高效更新的核心机制。

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

相关文章

vue实现选择本地文件

vue实现选择本地文件

实现文件选择功能 在Vue中实现本地文件选择可以通过HTML原生的<input type="file">元素实现。创建一个基本的文件选择组件: <template> &l…

vue实现付款

vue实现付款

Vue 实现付款功能 在 Vue 中实现付款功能通常需要集成第三方支付网关(如支付宝、微信支付、Stripe 等)。以下是常见的实现方法: 集成支付宝/微信支付 安装必要的依赖(如 axios 用于…

vue实现pc

vue实现pc

Vue 实现 PC 端应用开发 Vue.js 是一个流行的前端框架,适用于构建 PC 端 Web 应用。以下是关键步骤和最佳实践: 项目初始化 使用 Vue CLI 或 Vite 创建项目:…

vue实现模糊

vue实现模糊

Vue实现模糊搜索的方法 在Vue中实现模糊搜索功能通常需要结合输入框和列表渲染,通过监听输入内容动态过滤数据。以下是几种常见实现方式: 使用计算属性实现 计算属性适合处理需要响应式更新的搜索逻辑:…

vue实现烟花

vue实现烟花

Vue 实现烟花效果 在 Vue 中实现烟花效果可以通过结合 CSS 动画和 JavaScript 动态生成烟花元素。以下是具体实现方法: 动态生成烟花元素 通过 Vue 的 v-for 动态生成烟…

vue ui实现创建vue项目

vue ui实现创建vue项目

使用 Vue UI 创建 Vue 项目 Vue UI 是 Vue CLI 提供的图形化界面工具,可以通过可视化操作创建和管理 Vue 项目。 安装 Vue CLI 确保已安装 Node.js(建议版…