MVVM(Model-View-ViewModel)是一种软件设计模式,它促进了界面(UI)和业务逻辑的分离,主要用于构建用户界面。
MVVM是啥
Model(模型)
- 模型代表应用程序的数据逻辑,如数据库记录。
- 它封装了数据访问和业务逻辑,不直接与UI交互。
- 当数据变化时,模型通知ViewModel。
或者简单理解为存储数据的地方。
View(视图)
- 视图是用户界面的一部分,展示给用户看。
- 它通常是由XAML(在.NET环境中)或HTML/CSS(在web环境中)定义的。
- 视图绑定到ViewModel上的属性和命令,当ViewModel更新时,视图自动更新。
- 视图不直接与模型交互。
简单理解为可视化界面,就是UI啦
ViewModel(视图模型)
- ViewModel作为视图和模型之间的桥梁。
- 它公开数据对象和命令来管理视图的状态和事件。
- ViewModel通过数据绑定与View通信,View通过事件和命令与ViewModel通信。
- ViewModel将模型的数据转换为适合视图显示的格式。
- 它也处理用户交互,如按钮点击,并将这些交互转换为模型的操作。
MVVM运行过程
- ViewModel作为视图和模型之间的桥梁。它公开数据对象和命令来管理视图的状态和事件。
- ViewModel通过数据绑定与View通信,View通过事件和命令与ViewModel通信。
- ViewModel将模型的数据转换为适合视图显示的格式。
- 它也处理用户交互,如按钮点击,并将这些交互转换为模型的操作。
前端框架和MVVM的关系
前端框架和MVVM(Model-View-ViewModel)之间的关系主要体现在前端框架如何实现MVVM模式,以及它们如何提供工具和库来帮助开发者构建遵循MVVM架构的应用程序。
前端框架,如Angular、Vue.js和Knockout.js,提供了实现MVVM模式的机制。这些框架通常包括以下特性:
- 数据绑定:前端框架通常提供数据绑定机制,允许开发者将视图模型(ViewModel)的属性绑定到视图(View)的元素上。这样,当ViewModel的属性发生变化时,视图会自动更新,反之亦然。
- 依赖注入:一些框架支持依赖注入,这是一种设计模式,允许开发者将服务或依赖项注入到ViewModel中,从而提高代码的模块化和可测试性。
- 指令 /组件:前端框架允许开发者定义自定义指令或组件,这些是可重用的UI元素,它们可以有自己的逻辑和视图,并且可以轻松地集成到应用程序中。
- 事件处理:框架通常提供了一种方式来处理用户事件,如点击、输入等,这些事件可以触发ViewModel中的命令或方法。
- 路由:现代前端框架通常还包括路由库,允许开发者管理应用程序中的页面导航和视图切换。
- 状态管理:对于复杂的应用程序,一些框架提供了状态管理的解决方案,如Vuex(Vue.js)、ngrx(Angular),这些解决方案帮助开发者以可预测的方式管理应用程序的状态。
vue中的MVVM
在Vue.js中,MVVM模式被广泛应用,Vue通过自己的实现方式来确保数据在Model和View之间的同步。
下面是如何在Vue中利用MVVM模式更新UI界面的详细步骤:
- 定义ViewModel: 在Vue中,每个组件实例就是一个ViewModel。它负责将Model(即数据)和View(即DOM)连接起来。在创建一个Vue实例时,你可以通过
data函数返回一个对象来定义Model部分的数据。
var vm = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
});
- 数据绑定: Vue使用了一种双向数据绑定机制,称为
v-model,它可以在输入元素(如<input>、<textarea>、<select>)上创建数据的双向绑定。当用户在输入框中输入内容时,ViewModel中的数据会实时更新,反之亦然。
<div id="app">
<input v-model="message">
<p>The message is: {{ message }}</p>
</div>
- 声明式渲染: Vue.js使用声明式渲染来描述UI界面的状态。你可以使用Mustache语法(
{{ }})或其他指令(如v-bind、v-for、v-if等)来绑定ViewModel中的数据到视图上。
<div id="app">
<p>{{ message }}</p>
</div>
-
响应式系统: 当你在ViewModel的
data中定义数据时,Vue会使用其响应式系统对这些数据进行追踪。它通过对象方法Object.defineProperty()来实现对属性的getter和setter的劫持,从而能够侦听数据的变化。- 依赖收集:当组件渲染时,Vue会记录所有被访问的属性,这些属性被视为依赖。每个属性都关联一个观察者(Watcher),当属性值发生变化时,会通知所有依赖于该属性的观察者。
- 变更检测:当你修改ViewModel中的数据时,Vue的响应式系统会自动检测到变化,并通知所有依赖于该数据的视图进行更新。
-
更新 DOM: 当ViewModel中的数据发生变化时,Vue会触发视图的更新过程。这个过程是通过虚拟DOM来优化的。Vue首先会构建一个虚拟DOM树,当数据变化时,它会重新渲染这个虚拟DOM树,并与上一次的虚拟DOM树进行比较(diff算法),只有发生变化的部分才会被实际更新到真实的DOM中。
vue3和vue2中的响应式
Vue 3引入了新的响应式系统,与Vue 2的响应式系统相比有显著的改进。
-
Vue 2的响应式系统:
- 使用
Object.defineProperty()来劫持对象的属性。 - 对象的每个属性都有一个对应的getter和setter,用于追踪依赖和触发更新。
- 数组的变化侦测是通过重写数组方法(如
push、pop、shift等)来实现的。 - 对于对象的新增属性和删除属性,以及数组的索引和长度的变化,需要使用
Vue.set和Vue.delete方法来确保响应性。 - 对象的属性必须在创建Vue实例时就声明,否则新增的属性不会是响应式的。
- 使用
-
Vue 3的响应式系统:
- 使用ES6的
Proxy特性来实现响应式,这允许Vue 3拦截对象的所有操作,包括属性读取、写入、枚举、函数调用等。 - Proxy可以直接处理数组和嵌套对象,不需要像Vue 2那样对数组方法进行特殊处理。
- Proxy可以自然地侦测到对象属性的添加和删除,以及数组索引和长度的变化,因此不再需要
Vue.set和Vue.delete。 - 性能提升:Vue 3的响应式系统在初始化和运行时都有更好的性能,因为Proxy可以直接处理更多的操作,而不需要为每个属性设置getter和setter。
- 更好的树摇(tree-shaking)支持:由于Vue 3的响应式系统是模块化的,这意味着你可以只导入你的应用程序实际需要的部分,从而减少最终打包体积。
- 使用ES6的
-
其他改进:
- Vue 3引入了Composition API,这是一个新的编程范式,与Options API并存。它允许开发者更灵活地组合和重用逻辑,同时也使得响应式逻辑的编写更加直观和可维护。
- Vue 3的响应式系统更加灵活,可以更好地支持自定义响应式系统和外部库的集成。
-
总结
真的要多看MDN啊。。。。。。