当前位置:首页 > VUE

vue怎样实现mvvm

2026-01-14 02:47:08VUE

Vue 实现 MVVM 的模式

Vue 通过数据绑定和响应式系统实现 MVVM(Model-View-ViewModel)架构。以下是核心实现机制:

数据绑定与响应式系统

Vue 使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)劫持数据对象的属性访问。当数据变化时,触发依赖收集的 Watcher 更新视图。

// Vue 2 响应式简化示例
function defineReactive(obj, key) {
  let value = obj[key];
  const dep = new Dep(); // 依赖收集器

  Object.defineProperty(obj, key, {
    get() {
      dep.depend(); // 收集当前依赖
      return value;
    },
    set(newVal) {
      if (newVal !== value) {
        value = newVal;
        dep.notify(); // 通知更新
      }
    }
  });
}

虚拟 DOM 与 Diff 算法

Vue 将模板编译为虚拟 DOM,通过 Diff 算法比对变化后生成最小化 DOM 操作,高效更新视图。

vue怎样实现mvvm

// 虚拟 DOM 结构示例
{
  tag: 'div',
  attrs: { id: 'app' },
  children: [
    { tag: 'span', text: 'Hello Vue' }
  ]
}

模板编译

Vue 模板通过编译器转换为渲染函数。例如以下模板:

<div>{{ message }}</div>

会被编译为类似以下的渲染函数:

vue怎样实现mvvm

function render() {
  return _c('div', [_v(_s(message))]);
}

依赖收集与派发更新

  • 依赖收集:在渲染过程中,触发数据的 getter 将 Watcher 添加到依赖列表。
  • 派发更新:数据变化时触发 setter,通知所有 Watcher 执行更新。

MVVM 各层对应关系

  • Model:Vue 的 data 对象,代表业务数据。
  • View:模板或渲染函数生成的 DOM 结构。
  • ViewModel:Vue 实例,负责同步 Model 和 View,处理事件绑定等逻辑。

双向绑定实现

通过 v-model 指令实现表单元素与数据的双向绑定:

<input v-model="message">

等价于:

<input 
  :value="message" 
  @input="message = $event.target.value">

标签: vuemvvm
分享给朋友:

相关文章

vue实现按卡片轮播

vue实现按卡片轮播

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

vue实现导航栏切图

vue实现导航栏切图

Vue 实现导航栏切图 使用 Vue Router 实现基础导航 在 Vue 项目中,可以通过 Vue Router 实现导航栏的路由切换。创建一个导航栏组件,并在其中使用 <router-li…

vue实现store

vue实现store

Vue 实现 Store 在 Vue 中,可以通过 Vuex 或 Pinia 实现全局状态管理(Store)。以下是两种主流方案的实现方法。 使用 Vuex 实现 Store Vuex 是 Vu…

vue实现单点

vue实现单点

Vue 实现单点登录(SSO)方案 单点登录(SSO)允许用户在多个相关但独立的系统中使用同一组凭证登录。以下是基于 Vue 的实现方案: 基于 OAuth2/OpenID Connect 的实现…

vue实现摘要

vue实现摘要

Vue 实现摘要的方法 在 Vue 中实现文本摘要功能通常涉及截取文本的前部分内容并添加省略号。可以通过计算属性、过滤器或自定义指令来实现。 计算属性实现 在 Vue 组件中定义一个计算属性,用于截…

vue实现截图

vue实现截图

Vue 实现截图的方法 使用 html2canvas 库 安装 html2canvas 库: npm install html2canvas 在 Vue 组件中使用: import html2ca…