当前位置:首页 > VUE

vue实现mvvm原理

2026-02-20 04:28:33VUE

Vue实现MVVM原理的核心机制

Vue的MVVM实现主要依赖数据劫持结合发布者-订阅者模式,通过以下核心模块协同工作:

数据劫持(Observer)

通过Object.defineProperty或ES6的Proxy拦截对象属性的读写操作。当数据发生变化时,能触发setter通知依赖收集系统。

// 简化版数据劫持实现
function observe(data) {
  Object.keys(data).forEach(key => {
    let value = data[key]
    Object.defineProperty(data, key, {
      get() {
        return value
      },
      set(newVal) {
        if (newVal !== value) {
          value = newVal
          dep.notify() // 触发更新
        }
      }
    })
  })
}

依赖收集(Dep)

每个被劫持的属性都会拥有一个Dep实例,用于管理所有订阅该属性变化的Watcher。

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

订阅者(Watcher)

作为Observer和Compiler之间的桥梁,当数据变化时触发视图更新。每个表达式或指令都会对应一个Watcher实例。

class Watcher {
  constructor(vm, exp, cb) {
    this.vm = vm
    this.exp = exp
    this.cb = cb
    this.value = this.get()
  }
  get() {
    Dep.target = this
    let value = this.vm[this.exp] // 触发getter
    Dep.target = null
    return value
  }
  update() {
    this.cb.call(this.vm)
  }
}

模板编译(Compiler)

解析模板中的指令和插值表达式,初始化视图并建立数据与DOM的绑定关系。

function compile(node, vm) {
  if (node.nodeType === 1) { // 元素节点
    compileElement(node, vm)
  } else if (node.nodeType === 3) { // 文本节点
    compileText(node, vm)
  }
}

实现流程

  1. 初始化时通过Observer劫持所有数据
  2. 编译模板时遇到指令或插值会创建Watcher并添加到对应属性的Dep中
  3. 数据变化时通过setter触发Dep.notify()
  4. Watcher收到通知后执行更新操作

虚拟DOM优化

现代Vue版本引入虚拟DOM进行差异化更新:

  • 将模板编译为渲染函数
  • 数据变化时生成新的VNode
  • 通过diff算法比对新旧VNode
  • 最小化DOM操作

Proxy替代方案

Vue3使用Proxy替代Object.defineProperty,优势包括:

  • 直接监听对象而非属性
  • 可检测数组索引变化
  • 支持Map/Set等新数据类型
  • 性能更好

这种实现方式使得开发者只需关注数据逻辑,DOM更新由框架自动完成,实现了数据与视图的自动同步。

vue实现mvvm原理

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

相关文章

eventbus vue实现

eventbus vue实现

EventBus 实现原理 EventBus 是一种发布/订阅模式,用于 Vue 组件间的通信。核心是通过一个中央事件总线管理事件监听和触发。 创建 EventBus 在 Vue 项目中创建一个独…

vue 方法实现

vue 方法实现

在 Vue 中,方法的实现通常通过 methods 选项完成。以下是 Vue 方法实现的核心要点和示例: 基本方法定义 在 Vue 组件中定义方法时,需将函数声明放在 methods 对象内。这些…

vue实现过滤

vue实现过滤

Vue实现过滤的方法 在Vue中实现数据过滤可以通过多种方式完成,以下是几种常见的方法: 使用计算属性过滤 计算属性是Vue中处理数据过滤的理想选择,它们基于响应式依赖进行缓存,只有在相关依赖发生…

vue SSG实现

vue SSG实现

Vue SSG 实现方法 Vue 的静态站点生成(SSG)可以通过多种工具和框架实现,以下是几种常见的方法: 使用 VuePress VuePress 是一个基于 Vue 的静态站点生成器,适合文…

实现vue table

实现vue table

Vue 表格实现方法 基础表格实现 使用 Vue 的 v-for 指令可以快速渲染表格数据。在模板中定义表格结构,通过数据绑定动态生成行和列。 <template> <tabl…

实现vue cli

实现vue cli

安装 Vue CLI 确保系统中已安装 Node.js(版本建议 12.x 或更高)。通过 npm 全局安装 Vue CLI: npm install -g @vue/cli 安装完成后验证版本:…