Vue-MVVM 模型

一、什么是 MVVM?

MVVM 是一种软件架构设计模式,全称为 Model-View-ViewModel,它将应用程序分为三个核心部分:

层级 说明
Model 数据模型,代表应用的数据和业务逻辑(如用户信息、订单数据等)
View 视图层,用户看到的 UI 界面(DOM 结构)
ViewModel 视图与模型之间的"桥梁",负责监听 Model 的变化并更新 View,同时也监听 View 的交互并更新 Model

✅ MVVM 的核心思想:

数据驱动视图,视图变化自动同步数据。

这与传统的"操作 DOM 更新数据"完全不同,MVVM 让开发者专注于数据本身,而无需手动操作 DOM。

二、MVVM 与其他模式对比

模式 特点 代表框架
MVC 控制器(Controller)处理逻辑,更新视图 早期 Angular、Backbone
MVP Presenter 作为中间层,主动更新 View Android 开发常用
MVVM ViewModel 双向绑定 View 和 Model,自动同步 Vue、Angular、WPF

🔍 Vue 是典型的 MVVM 框架,虽然官方并未严格定义自己为 MVVM,但其设计思想与 MVVM 高度契合。

三、Vue 中的 MVVM 实现原理

我们以一个简单的 Vue 示例来解析 MVVM 的运作流程:

html 复制代码
<div id="app">
  <input v-model="message" placeholder="输入内容">
  <p>{{ message }}</p>
</div>

<script src="https://unpkg.com/vue@3"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        message: 'Hello Vue!'
      }
    }
  }).mount('#app')
</script>

🧩 各部分对应 MVVM 角色:

Vue 元素 对应 MVVM 层级
data() 返回的对象 Model
<input><p> 标签 View
Vue 实例(app) ViewModel

🔁 数据流解析:

  1. 初始化 :Vue 实例创建时,data 中的数据被劫持(通过 ProxyObject.defineProperty),变成响应式。
  2. 视图渲染 :模板中的 {``{ message }}v-model 被编译成渲染函数,首次渲染页面。
  3. 数据变化 → 视图更新 :当 message 改变时,Vue 自动通知视图重新渲染。
  4. 视图交互 → 数据更新 :用户在输入框输入内容,v-model 监听到 input 事件,自动更新 message

这就是 双向绑定 的体现!

四、核心机制:响应式系统

Vue 的 MVVM 能够"自动同步",依赖于其强大的 响应式系统

Vue 2 vs Vue 3 实现方式:

版本 响应式原理 局限性
Vue 2 Object.defineProperty 无法监听对象新增/删除属性
Vue 3 Proxy + Reflect 更强大,可监听整个对象、数组、动态属性

简化版响应式原理代码(Vue 3 风格):

javascript 复制代码
function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      console.log(`获取 ${key}:`, target[key])
      return Reflect.get(target, key, receiver)
    },
    set(target, key, value, receiver) {
      console.log(`设置 ${key} = ${value}`)
      const result = Reflect.set(target, key, value, receiver)
      // 这里可以触发视图更新(notify)
      updateView()
      return result
    }
  })
}

function updateView() {
  console.log('🔄 视图更新...')
}

// 使用
const state = reactive({ message: 'Hello' })
state.message = 'World'  // 自动触发视图更新

💡 实际 Vue 源码中,通过 effecttracktrigger 实现依赖收集和派发更新,更加复杂高效。

五、双向绑定的实现:v-model

v-model 是 Vue 中实现双向绑定的语法糖。

等价转换:

html 复制代码
<!-- 使用 v-model -->
<input v-model="message">

<!-- 等价于 -->
<input 
  :value="message" 
  @input="message = $event.target.value"
>

MVVM 中的角色:

  • View → Model@input 事件更新 message
  • Model → View:value 绑定将数据渲染到输入框

这就是典型的 ViewModel 双向桥接

六、MVVM 的优势与局限

✅ 优势:

  1. 开发效率高:无需手动操作 DOM,专注数据逻辑。
  2. 维护性强:数据与视图分离,结构清晰。
  3. 自动更新:响应式系统保证数据与视图一致性。
  4. 组件化友好:每个组件都可以看作一个小型 MVVM。

❌ 局限性:

  1. 学习成本:响应式原理、依赖追踪等概念较抽象。
  2. 性能开销:响应式劫持对大型对象有一定性能影响。
  3. 调试困难:数据变化链路较长,不易追踪。

七、MVVM 在 Vue 3 中的演进

Vue 3 进一步优化了 MVVM 的实现:

  • Composition API :通过 refreactivewatch 等函数,更灵活地组织 ViewModel 逻辑。
  • 更好的 TypeScript 支持:类型推断更准确,提升开发体验。
  • Tree-shaking:按需引入,减少打包体积。
javascript 复制代码
import { ref, watch } from 'vue'

export default {
  setup() {
    const message = ref('Hello')

    watch(message, (newVal) => {
      console.log('message changed:', newVal)
    })

    return { message }
  }
}

🔥 setup() 函数本质上就是 ViewModel 的"逻辑容器"。

八、总结

概念 说明
MVVM Model-View-ViewModel,Vue 的核心设计模式
Model 数据源,由 dataref/reactive 定义
View 模板或 JSX,描述 UI 结构
ViewModel Vue 实例,负责数据与视图的双向同步
响应式 通过 Proxy 实现数据劫持,自动更新视图
v-model 双向绑定语法糖,简化表单处理

九、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
Jonathan Star18 分钟前
沉浸式雨天海岸:用A-Frame打造WebXR互动场景
前端·javascript
工业甲酰苯胺1 小时前
实现 json path 来评估函数式解析器的损耗
java·前端·json
老前端的功夫1 小时前
Web应用的永生之术:PWA落地与实践深度指南
java·开发语言·前端·javascript·css·node.js
LilySesy1 小时前
ABAP+WHERE字段长度不一致报错解决
java·前端·javascript·bug·sap·abap·alv
Wang's Blog2 小时前
前端FAQ: Vue 3 与 Vue 2 相⽐有哪些重要的改进?
前端·javascript·vue.js
再希3 小时前
React+Tailwind CSS+Shadcn UI
前端·react.js·ui
用户47949283569153 小时前
JavaScript 的 NaN !== NaN 之谜:从 CPU 指令到 IEEE 754 标准的完整解密
前端·javascript
群联云防护小杜3 小时前
国产化环境下 Web 应用如何满足等保 2.0?从 Nginx 配置到 AI 防护实战
运维·前端·nginx
ss2733 小时前
Springboot + vue 医院管理系统
vue.js·spring boot·后端
醉方休3 小时前
Web3.js 全面解析
前端·javascript·electron