当前位置:首页 > 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,优势包括:

vue实现mvvm原理

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

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

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

相关文章

vue实现安全免登录

vue实现安全免登录

Vue 实现安全免登录的方案 免登录功能通常通过持久化认证状态(如 Token)实现,但需兼顾安全性。以下是基于 Vue 的常见实现方案: 基于 Token 的免登录 登录成功后存储 Token…

vue手写签名如何实现

vue手写签名如何实现

实现手写签名的基本思路 在Vue中实现手写签名功能,通常需要借助HTML5的Canvas API来捕获用户的绘制操作。核心流程包括初始化画布、监听触摸/鼠标事件、记录轨迹以及生成签名图片。…

用vue实现滑动输入条

用vue实现滑动输入条

使用 Vue 实现滑动输入条 使用原生 HTML5 input range 实现 在 Vue 模板中直接使用 <input type="range">,通过 v-model 绑定数据:…

vue实现ai

vue实现ai

Vue 实现 AI 功能 Vue.js 可以通过集成第三方 AI 服务或本地 AI 模型来实现 AI 功能。以下是几种常见的方法: 集成第三方 AI API 使用 Vue 调用如 OpenAI、Go…

vue广告实现

vue广告实现

Vue 广告实现方法 在 Vue 项目中实现广告功能可以通过多种方式完成,具体取决于广告类型和需求。以下是几种常见的实现方法: 使用第三方广告平台 许多广告平台如 Google AdSense、百…

vue实现路由

vue实现路由

Vue 路由的实现方法 Vue 路由可以通过 Vue Router 库来实现,Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue Router 通…