深入理解MVVM架构模式

原文合集地址如下,有需要的朋友可以关注

本文地址

MVVM原理

MVVM是一种用于构建用户界面的软件架构模式,它的名称代表着三个组成部分:Model(模型)、View(视图)和ViewModel(视图模型)。MVVM的主要目标是将应用程序的UI与其底层数据模型分离,通过数据绑定实现数据和UI的自动同步,从而降低代码的耦合度,提高应用程序的可维护性和可测试性。
zhao在这里插入图片描述

MVVM框架的原理如下:

  1. Model(模型):

    • Model表示应用程序的数据模型或业务逻辑,负责处理数据的存取、处理和操作。它通常包含数据结构、数据库操作、网络请求等。
    • Model并不直接与UI层交互,它只暴露一些接口供ViewModel层调用,使得ViewModel可以获取所需的数据。
  2. View(视图):

    • View是用户界面的可视化部分,负责展示数据并与用户进行交互。
    • View通常由XML、HTML、XAML等描述,这取决于具体的开发平台。
  3. ViewModel(视图模型):

    • ViewModel是Model和View之间的桥梁,负责将数据从Model中取出并转换成View可用的形式。
    • ViewModel不直接操作View,而是通过数据绑定机制将数据与View进行绑定,使得数据的变化可以自动反映在View上,实现了数据的双向绑定。
    • ViewModel通常也包含用户交互的逻辑,例如处理用户输入、按钮点击等。
  4. 数据绑定(Data Binding):

    • 数据绑定是MVVM框架的核心特性之一。它将View和ViewModel的数据同步连接,使得它们保持同步。
    • 当ViewModel中的数据发生变化时,数据绑定会自动更新View中绑定到这些数据的部分,反之亦然。
  5. 双向绑定(Two-way Data Binding):

    • 双向绑定是数据绑定的一种扩展,它允许数据的改变能够实时地反映在View中,并且用户在View中的输入也能即时地更新ViewModel中的数据。
    • 这种双向绑定在处理表单、用户输入等场景中特别有用。

MVVM本质

MVVM的本质是解耦。它通过将UI逻辑从View中分离出来,将数据处理逻辑从View和Model中分离出来,使得每个组件的职责更加明确,代码更易于组织和维护。ViewModel充当着View和Model之间的桥梁,负责将Model中的数据转换成View可用的形式,并且通过数据绑定将数据自动同步到View上。这种双向绑定使得UI的更新变得自动化,开发者只需要专注于数据的处理和业务逻辑的编写,而无需过多关心UI的更新。

前端的MVC

前端的MVC(Model-View-Controller)是另一种常见的架构模式,它和MVVM有一些相似之处,但在实现上有一些区别。以下是前端的MVC的简要介绍:

  1. Model(模型):

    • Model表示应用程序的数据和业务逻辑,负责处理数据的存取、处理和操作。它通常包含数据结构、数据库操作、网络请求等。
  2. View(视图):

    • View是用户界面的可视化部分,负责展示数据并与用户进行交互。View通常由HTML、CSS、JavaScript等描述,用于展示数据和用户操作的表现。
  3. Controller(控制器):

    • Controller充当着View和Model之间的中介,负责处理用户输入和业务逻辑,并将更新后的数据传递给View进行显示。它负责协调View和Model的交互。

前端的MVC模式的核心思想是将应用程序的数据、业务逻辑和用户界面进行分离,使得每个组件的职责更加明确,代码更易于组织和维护。

在MVC模式中,View和Model是相互解耦的,它们不直接交互,而是通过Controller来进行通信。当用户与View进行交互时,View会将事件通知给Controller,Controller根据事件的类型和用户输入处理相关的业务逻辑,并更新Model中的数据。然后,Controller将更新后的数据传递给View,使得View可以展示最新的数据给用户。

需要注意的是,MVC模式中并没有像MVVM那样的数据绑定机制。在MVC中,View需要主动从Model中获取数据,并由Controller负责将数据传递给View进行展示。这使得开发者需要手动编写代码来同步更新数据和UI,相对来说,MVVM的数据绑定机制在这方面更加简化了开发流程。

虽然MVC和MVVM在一些方面有一些相似之处,但它们在分层结构和数据绑定机制等方面存在差异,开发者可以根据项目需求和个人偏好来选择适合的架构模式。

vue中的MVVM

在Vue中,MVVM的应用是通过Vue框架提供的功能来实现的。Vue.js是一个流行的JavaScript框架,专注于实现响应式的用户界面和组件化开发。下面是Vue中如何应用MVVM的一些关键点:

  1. 数据绑定:

    • Vue.js提供了强大的数据绑定功能,可以通过v-bind和v-model等指令将数据与View进行绑定。v-bind指令用于将数据绑定到View上,v-model指令则可以实现双向数据绑定,使得用户在View中的输入能够即时地更新ViewModel中的数据。
  2. 视图模板(View Template):

    • 在Vue中,开发者可以使用类似HTML的模板语法来定义视图,这些模板语法中可以插入Vue实例中的数据,从而实现数据的展示和渲染。
  3. Vue实例(ViewModel):

    • Vue实例充当着ViewModel的角色,它是Vue应用的根实例,负责管理应用中的数据和逻辑。在Vue实例中,开发者可以定义数据、方法和计算属性等,用于处理数据逻辑和响应用户交互。
  4. 计算属性和观察者:

    • Vue提供了计算属性和观察者等功能,用于实现数据的处理和监控。计算属性可以根据其他数据的变化自动计算得出新的值,而观察者可以监听数据的变化并执行相应的操作。
  5. 组件化开发:

    • Vue支持组件化开发,开发者可以将UI和逻辑封装成可复用的组件。每个组件都有自己的数据和逻辑,通过props和events等机制,实现了组件之间的数据通信和交互。

总的来说,Vue中的MVVM模式是通过数据绑定、视图模板、Vue实例以及计算属性和观察者等特性来实现的。这些功能使得开发者能够轻松地构建响应式的用户界面,并将数据和视图分离,使代码更易于维护和扩展。通过Vue的MVVM特性,开发者可以更专注于业务逻辑的实现,而不用过多关心数据和UI之间的同步。

MVVM与MVC区别

MVVM(Model-View-ViewModel)和MVC(Model-View-Controller)都是用于构建软件应用的架构模式,它们在组织代码和分离关注点方面有一些不同之处。以下是MVVM和MVC的核心区别:

  1. 角色和职责分配:

    • MVC:在MVC中,Model表示应用程序的数据和业务逻辑,View负责展示数据并与用户进行交互,Controller充当着View和Model之间的中介,负责处理用户输入并更新Model和View之间的数据传递。
    • MVVM:在MVVM中,Model同样表示应用程序的数据和业务逻辑,View仍然负责展示数据并与用户进行交互,但ViewModel取代了Controller的角色,它充当着View和Model之间的桥梁,负责将Model中的数据转换成View可用的形式,并通过数据绑定实现数据的同步更新。
  2. 数据绑定:

    • MVC:在MVC中,View和Model之间通常没有直接的数据绑定机制,通常需要手动编写代码来同步更新数据。
    • MVVM:MVVM的一个重要特点是数据绑定。ViewModel和View之间通过数据绑定实现数据的双向绑定,使得数据的变化能自动反映在View上,并且用户在View中的输入也能即时地更新ViewModel中的数据。
  3. UI逻辑:

    • MVC:在MVC中,UI逻辑通常存在于View和Controller中,Controller负责处理用户输入和业务逻辑,并将更新后的数据传递给View进行显示。
    • MVVM:在MVVM中,UI逻辑主要存在于ViewModel中,View只负责展示数据,而不包含业务逻辑。ViewModel负责处理用户交互、按钮点击等,以及数据的转换和处理逻辑。
  4. 应用场景:

    • MVC:MVC适用于许多应用场景,包括Web应用程序、传统的桌面应用程序等。
    • MVVM:MVVM主要用于现代前端和移动应用程序开发,特别适用于响应式的用户界面和数据驱动的应用。

总的来说,MVVM和MVC的核心区别在于ViewModel的引入和数据绑定机制。MVVM通过引入ViewModel来实现数据和UI的自动同步,从而降低了代码的耦合度和提高了应用程序的可维护性。数据绑定是MVVM的重要特性,使得数据的双向绑定在处理用户输入和更新UI方面变得更加高效和方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/88848.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tkinter+爬虫+pygame实现音乐播放器

文章目录 前文安装模块示意图爬虫完整代码pygametkinter完整代码结尾前文 本文将涉及爬虫(数据的获取),pygame(音乐播放器),tkinter(界面显示),将他们汇聚到一起制造一个音乐播放器,欢迎大家的订阅。 安装模块 pip install requests,parsel,lxpy,pygame 示意图

19. python从入门到精通——Web编程

HTTP协议 HTTP协议的常用方法 方法 描述 GET 请求指定的页面信息,并返回实体主体。 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 …

WebAPIs 第四天

1.日期对象 2.节点操作 3.M端事件 4.JS插件 一.日期对象 实例化时间对象方法时间戳 日期对象:用来表示时间的对象 作用:可以得到当前系统时间 1.1 实例化 ① 概念:在代码中发现了new关键字时,一般将这个操作称为实例化 …

Go 异步任务

Go 异步任务 异步任务在开发中很常见,用来做解耦。本文介绍一下异步队列的实现的几个问题,并且结合三方库实现来分析。 有下面的几个关键点: 用户代码(任务)如何封装数据的存放(数据存放在哪里?就是一个…

[数据集][目标检测]骑电动车摩托车不戴头盔数据集VOC格式1385张

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):1385 标注数量(xml文件个数):1385 标注类别数:2 标注类别名称:["y","n&q…

“Can‘t open perl script configure : No such file or directory”的解决办法

编译OpenSSL的时候执行到 perl configure 时提示找不到configure, 然后在网上搜了搜,大家给的解决办法一般都是说设置环境变量或者指定configure路径再执行;我试了都不行, 最后我把perl卸了重装就正常了; 然后我换了…

服务器数据恢复-RAID5上层Hyper-V虚拟机数据恢复案例

服务器数据恢复环境: 一台Windows Server服务器,部署Hyper-V虚拟化环境,虚拟机的硬盘文件和配置文件存放在一台DELL存储中。该存储中有一组由4块硬盘组建的RAID5阵列,用来存放虚拟机的数据文件,另外还有一块大容量硬盘…

Pyqt5使QTextEdit或QLabel等框框背景透明

设置:textEdit->setStyleSheet(“background-color: rgb(255, 255, 255, 60);”);

如何使用Mac终端给树莓派pico构建C/C++程序进行开发,以及遇到各种问题该怎么处理,不使用任何IDE或编辑器(例如VS Code)

写本文的原因是官方的教程已经过时了,如果你现在按照官方教程来在 Mac 上进行配置,那么会遇到一堆问题,比如我几乎把能踩的“雷”都踩了。所以这里记录了完整过程,以及各种错误的原因和处理方法,不然以后换 Mac 了或者…

2023上半年京东奶粉行业品牌销售排行榜(京东数据分析平台)

近年来,受新生儿人口数量下降的影响,婴幼儿奶粉市场的需求量萎缩,市场由增量竞争转为存量竞争。根据鲸参谋电商数据分析平台的数据显示,今年上半年,京东婴幼儿奶粉市场的销量将近4400万,环比下降约19%&…

电气测试相关

项目: 长期过电压 瞬态过电压 瞬态欠压 跳跃启动 卸载 纹波电压 电源电压缓慢下降和上升 电源电压缓慢下降、快速上升 复位行为 短暂中断 启动脉冲 带电气系统控制的电压曲线 引脚中断 连接器中断 反极性 信号线和负载电路短路 启动行为 对分流不…

form中表单切换,导致 relus 中的事件无法触发,原因:页面切换不要一直切换DOM,会导致问题,需要都显示出来

修改前&#xff0c;因为重复渲染DOM导致绑定rules失效 修改前代码使用 computed 计算出渲染的DOM&#xff0c;影响rules事件<el-formref"form"inline:model"billDetailCopy":rules"rules"size"small"label-position"right&quo…

YOLOv5可视化界面

Pyside6可视化界面 安装Pyside6 激活之前的虚拟环境yolov5 在该环境的终端输入以下命令 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyside6输入where python找到当前使用的Python的路径 找到该路径下的designer.exe文件&#xff08;/Lib/site-packages/PySi…

Java IO流——【从零构建信息管理系统】

Java I/O流——【从零构建信息管理系统】 文章目录 什么是Java I/O流介绍理解字节流和字符流的区别 Java I/O流的作用Java I/O流方法InputStream方法Reader方法OutputStream方法Writer方法Java I/O体系的全体类 使用示例Java I/O流在实际应用中使用效果 什么是Java I/O流 介绍…

idea集成chatGPT,免费使用的bito神器

什么是Bito&#xff1f; Bito是一款在IntelliJ IDEA编辑器中的插件&#xff0c;Bito插件是由ChatGPT团队开发的&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队&#xff0c;他们开发了一款基于GPT的自然语言处理…

Azure创建第一个虚拟机

首先&#xff0c;登录到 Azure 门户 (https://portal.azure.com/)。在 Azure 门户右上角&#xff0c;点击“虚拟机”按钮&#xff0c;并点击创建&#xff0c;创建Azure虚拟机。 在虚拟机创建页面中&#xff0c;选择所需的基本配置&#xff0c;包括虚拟机名称、操作系统类型和版…

Pytorch个人学习记录总结 10

目录 优化器 优化器 官方文档地址&#xff1a;torch.optimhttps://pytorch.org/docs/stable/optim.html Debug过程中查看的grad所在的位置&#xff1a; model --> Protected Atributes --> _modules --> ‘model’ --> Protected Atributes --> _modules -…

期刊和会议缩写查询网站

1.https://pubmed.ncbi.nlm.nih.gov/?termMedicalImageComputingandComputer-AssistedIntervention 2. http://www.letpub.com.cn/index.php?pagejournalapp&viewsearch 3. https://blog.csdn.net/weixin_44557349/article/details/120825927 https://blog.csdn.net/ret…

Vue中如何更好地封装组件?

子组件接受父组件传递的事件 1.子组件使用事件名"$emit(父组件中传递的事件名,想给父组件传递的参数(可选))" click"$emit(click)" 2.子组件使用 v-on"$listeners" 父组件&#xff1a; <template><div id"app"><myCo…

第 358 场LeetCode周赛题解

A 数组中的最大数对和 数据范围小&#xff0c;直接暴力枚举数对 class Solution { public:int mx(int x) {//返回10进制表示的数的最大数字int res 0;for (; x; x / 10)res max(res, x % 10);return res;}int maxSum(vector<int> &nums) {int n nums.size();int r…