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 双向绑定语法糖,简化表单处理

九、结语

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

相关推荐
Miketutu3 小时前
vxe-table编辑模式适配el-date-picker
javascript·vue.js·elementui
xvmingjiang3 小时前
Element Plus el-table 默认勾选行的方法
前端·javascript·vue.js
野生yumeko4 小时前
伪静态WordPress/Vue
前端·javascript·vue.js
爱因斯坦乐4 小时前
【vue】I18N国际化管理系统
前端·javascript·vue.js·笔记·前端框架
一只游鱼4 小时前
vue集成dplayer
前端·javascript·vue.js·播放器·dplayer
技术钱11 小时前
vue3 封装图片上传预览组件支持docx、excel、pdf、图片、txt格式
vue.js·pdf·excel
kyle~11 小时前
C++--- override 关键字 强制编译器验证当前函数是否重写基类的虚函数
java·前端·c++
Light6011 小时前
像素退场,曲线登场:现代响应式 CSS 全家桶 | 领码课堂
前端·css·响应式设计·css函数·布局系统·相对单位·设计令牌
爱生活的苏苏12 小时前
elementUI 表单验证-联动型校验
前端·javascript·elementui