当前位置:首页 > 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中实现登录业务通常涉及前端界面设计、表单验证、API请求交互、状态管理以及路由控制等环节。以下是核心实现步骤: 登录表单设计与验证 创建包含用户名和密码输入框的登录组…

vue交互实现

vue交互实现

Vue 交互实现方法 Vue.js 提供了多种方式实现用户交互,包括事件处理、表单绑定、动态渲染等。以下是常见的交互实现方法: 事件处理 通过 v-on 或 @ 指令绑定事件,触发方法或直接执行表达…

vue实现过程

vue实现过程

Vue 的实现过程 Vue 的实现过程可以分为多个核心模块,包括响应式系统、虚拟 DOM、模板编译等。以下是 Vue 的主要实现过程分析。 响应式系统 Vue 的响应式系统基于 Object.de…

vue实现jqueryui

vue实现jqueryui

Vue 实现 jQuery UI 功能 在 Vue 项目中实现类似 jQuery UI 的功能,可以通过原生 Vue 组件或第三方库来实现。以下是几种常见 jQuery UI 功能的 Vue 替代方案…

vue实现盖章

vue实现盖章

Vue 实现盖章功能 在Vue中实现盖章功能通常涉及前端UI交互,通过Canvas或SVG绘制印章,并允许用户拖拽或点击放置印章。以下是具体实现方法: 使用Canvas绘制印章 通过HTML5的…

vue实现订单

vue实现订单

Vue 实现订单功能 订单数据结构设计 订单数据通常包含以下字段: order: { id: String, // 订单ID userId: String,…