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

九、结语

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

相关推荐
烬头88212 分钟前
React Native鸿蒙跨平台采用了函数式组件的形式,通过 props 接收分类数据,使用 TouchableOpacity实现了点击交互效果
javascript·react native·react.js·ecmascript·交互·harmonyos
Amumu121382 分钟前
Vuex介绍
前端·javascript·vue.js
We་ct3 分钟前
LeetCode 54. 螺旋矩阵:两种解法吃透顺时针遍历逻辑
前端·算法·leetcode·矩阵·typescript
2601_9498095915 分钟前
flutter_for_openharmony家庭相册app实战+相册详情实现
javascript·flutter·ajax
qq_1777673719 分钟前
React Native鸿蒙跨平台通过Animated.Value.interpolate实现滚动距离到动画属性的映射
javascript·react native·react.js·harmonyos
2601_9498333929 分钟前
flutter_for_openharmony口腔护理app实战+饮食记录实现
android·javascript·flutter
2601_9494800637 分钟前
【无标题】
开发语言·前端·javascript
css趣多多42 分钟前
Vue过滤器
前端·javascript·vue.js
理人综艺好会1 小时前
Web学习之用户认证
前端·学习
●VON1 小时前
React Native for OpenHarmony:项目目录结构与跨平台构建流程详解
javascript·学习·react native·react.js·架构·跨平台·von