当前位置: 首页 > news >正文

深入理解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方面变得更加高效和方便。

相关文章:

深入理解MVVM架构模式

MVVM原理 MVVM是一种用于构建用户界面的软件架构模式,它的名称代表着三个组成部分:Model(模型)、View(视图)和ViewModel(视图模型)。MVVM的主要目标是将应用程序的UI与其底层数据模…...

配置IPv6 over IPv4手动隧道示例

组网需求 如图1所示,两台IPv6主机分别通过SwitchA和SwitchC与IPv4骨干网络连接,客户希望两台IPv6主机能通过IPv4骨干网互通。 图1 配置IPv6 over IPv4手动隧道组网图 配置思路 配置IPv6 over IPv4手动隧道的思路如下: 配置IPv4网络。配置接…...

Vue3--->组合式API与Pinia

目录 使用create-vue搭建 1、使用create-vue创建项目 2、项目目录和关键文件 组合式API 1、组合式API - setup选项 2、组合式API - reactive和ref函数 3、组合式API - computed 4、组合式API - watch 1、基础使用 - 侦听单个数据 2、基础使用 - 侦听多个数据 3、immediate&…...

三言两语说透柯里化和反柯里化

JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化的概念、实现原理和应用场景,然后介绍反柯里化的概念、实现原理和应用场景,通过大量的代码示例帮助读…...

细讲TCP三次握手四次挥手(四)

常见面试题 为什么TCP连接的时候是3次?2次不可以吗? 因为需要考虑连接时丢包的问题,如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据…...

HarmonyOS/OpenHarmony元服务开发-配置卡片的配置文件

卡片相关的配置文件主要包含FormExtensionAbility的配置和卡片的配置两部分: 1.卡片需要在module.json5配置文件中的extensionAbilities标签下,配置FormExtensionAbility相关信息。FormExtensionAbility需要填写metadata元信息标签,其中键名称…...

mac安装nacos,M1芯片

第一步,官网下载 》nacos官网 去github中下载对应的版本,本人下载的是1.4.1版本 在这儿选择其他的版本,下面这里选择 tar.gz 压缩包 解压后放到一个非中文的目录下,我选择在 user目录下面创建一个other目录,将使用的环…...

老板说把跳针改过去,什么是主板跳针

最近骑车拍了很多视频,把电脑磁盘堆满了,想着买一条固态SSD卡扩展一下。 一咬牙一跺脚,直接安排,毫不犹豫。顺带加装了无限网卡和蓝牙5.2。 收到后立马安装。安装完发现识别不到新磁盘 确认安装没问题。然后就去问固态硬盘的客服 …...

PyTorch代码实战入门

人这辈子千万不要马虎两件事 一是找对爱人、二是选对事业 因为太阳升起时要投身事业 太阳落山时要与爱人相拥 一、准备数据集 蚂蚁蜜蜂数据集 蚂蚁蜜蜂的图片,文件名就是数据的label 二、使用Dataset加载数据 打开pycharm,选择Anaconda创建的pytorch环…...

TSINGSEE青犀视频汇聚平台EasyCVR多种视频流播放协议介绍

众所周知,TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入,包括主流标准协议GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。今天我们来说一说,EasyCVR平台支持分…...

Vivado进行自定义IP封装

一. 简介 本篇文章将介绍如何使用Vivado来对上篇文章(FPGA驱动SPI屏幕)中的代码进行一个IP封装,Vivado自带的IP核应该都使用过,非常方便。 这里将其封装成IP核的目的主要是为了后续项目的调用,否则当我新建一个项目的时候,我需要将…...

开放自动化软件的硬件平台

自动化行业的产品主要以嵌入式系统为主,历来对产品硬件的可靠性和性能都提出很高的要求。最典型的产品要数PLC。PLC 要求满足体积小,实时性,可靠性,可扩展性强,环境要求高等特点。它们通常采用工业级高性能嵌入式SoC 实…...

AdvancedInstaller打包程序

文章目录 1. AdvancedInstaller 下载2. AdvancedInstaller 启动3. 新建工程4. 配置安装包详细信息5. 配置安装参数6. 添加要打包的文件7. 设置安装完成后启动程序8. 构建打包 1. AdvancedInstaller 下载 下载网址:https://www.advancedinstaller.com/ 2. AdvancedIn…...

无穷限积分习题

前置知识:无穷限积分 习题1 计算 ∫ 1 ∞ ln ⁡ x x 2 d x \int_1^{\infty}\dfrac{\ln x}{x^2}dx ∫1∞​x2lnx​dx 解: \qquad 原式 ( − ln ⁡ x x ) ∣ 1 ∞ ∫ 1 ∞ 1 x 2 d x ( − ln ⁡ x x ) ∣ 1 ∞ ( − 1 x ) ∣ 1 ∞ (-\dfrac{\…...

AI 3D结构光技术加持,小米引领智能门锁新标准

一直以来,小米智能门锁系列产品让更多家庭走进了安全便捷的智能生活,安全至上的设计让很多家庭都轻松告别了随身钥匙。 7月27日,小米正式推出小米智能门锁M20 Pro,再一次引领智能门锁产品的发展潮流。该款门锁采用AI 3D结构光技术…...

管理类联考——逻辑——形式逻辑——汇总篇

简述 形式逻辑: 识别题型:逻辑符号表达及标志词:联假言符号化特殊命题“除非否则”;五大关系:矛盾、等价、包含、至少有一真、至少有一假;【通过“关系”,串联起“假联选”言】 识别题型&…...

架构的分类

目录 一、 RUP41 架构 1.1 RUP41架构方法概述 1.2 RUP41架构总体 1.3 RUP41架构方法内容 1.3.1 逻辑视图 1.3.2 开发视图 1.3.3 物理视图 1.3.4 处理视图 1.3.5 场景视图 ​二、 TOGAF9 架构 2.1 TOGAF9 架构概述 2.2 TOGAF9 架构分类 2.2.1 业务架构 2.2.2 数据架…...

[SQL挖掘机] - 窗口函数 - lag

介绍: lag() 是一种常用的窗口函数,它用于获取某一行之前的行的值。它可以用来在结果集中的当前行之前访问指定列的值。 用法: lag() 函数的语法如下: lag(列名, 偏移量, 默认值) over (partition by 列名1, 列名2, ... order by 列名 [asc|desc], .…...

springboot项目如何自动重启(使用Devtools检测修改并自动重启springboot)

1. 问题: 我们在项目开发阶段,可能经常会修改代码,修改完后就要重启Spring Boot。经常手动停止再启动,比较麻烦。 所以我们引入一个Spring Boot提供的开发工具; 只要源码或配置文件发生修改,Spring Boot应用…...

docker: Error response from daemon: No command specified.

执行 docker run -it -d -v /home/dell/workspace/workspace/test_192.168.1.202_pipeline:/home/workspace1 --name test_192.168.1.202_pipeline_10 qnx:7.1报错 问题定位:export导入的镜像需要带上command,以下命令查看command信息 docker ps --no…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...

JS红宝书笔记 - 3.3 变量

要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...

小智AI+MCP

什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...