MVVM 与 MVC区别和应用场景?

news2025/2/24 9:14:29

MVVM 和 MVC

    • 1. MVC
    • 2. MVVM

1. MVC

MVC 是 Model View Controller 的缩写

  • Model:模型层,是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
  • View:视图层,用户界面渲染逻辑,通常视图是依据模型数据创建的。
  • Controller:控制器,数据模型和视图之间通信的桥梁,通常控制器负责从事图读取数据,控制用户输入,并向模型发送数据。
    在这里插入图片描述

MVC的思想: Controller负责将Model的数据用View显示出来,换句话说就是在Controller里面把Model的数据赋值给View。

MVC的特点: 实现关注点分离,即应用程序中的数据模型与业务和展示逻辑解耦。就是将模型和视图之间实现代码分离,松散耦合,使之成为一个更容易开发、维护和测试的客户端应用程序。

MVC的优点:

  • 耦合度低,视图层和业务层分离
  • 重用度高
  • 生命周期成本低
  • 可维护性高
  • 部署快

MVC的缺点:

  • 不适合小型项目的开发
  • 视图与控制器间的过于紧密的连接,视图与控制器是相互分离,但却是联系紧密的部件,妨碍了他们的独立重用
  • 降低了视图对模型数据的访问,依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。

MVC的应用: 主要用于中大型项目的分层开发。

MVC的例子: 举一个例子,页面有一个 id 为 container 的 span,点击按钮会让其内容加 1:

view:

<div>
  <span id="container">0</span>
  <button id="btn">+</button>
</div>

controller:

const button = document.getElementById('btn');
// 响应视图指令
button.addEventListener('click', () => {
  const container = document.getElementById('container');
  
  // 调用模型
  add(container);
}, false);

model:

function add (node) {
  // 业务逻辑处理
  const currentValue = parseInt(node.innerText);
  const newValue = currentValue + 1;
  
  // 更新视图
  node.innerText = current + 1;
}

这样就把数据更新分的比较明确了。

2. MVVM

MVVM是Model-View-ViewModel的简写,即模型-视图-视图模型。

  • Modal:模型,指的是后端传递的数据。
  • View:视图,指的是所看到的页面。
  • ViewModal:视图模型,mvvm模式的核心,它是连接view和model的桥梁。主要用来处理业务逻辑
    在这里插入图片描述
    它有两个方向:
  • 一是将模型转化成视图,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。
  • 二是将视图转化成模型,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。

这两个方向都实现的,就是数据的双向绑定。

MVVM的特点: 在MVVM的框架下,视图和模型是不能直接通信的,它们通过ViewModal来通信,ViewModel通常要实现一个observer观察者,当数据发生变化,ViewModel能够监听到数据的这种变化,然后通知到对应的视图做自动更新,而当用户操作视图,ViewModel也能监听到视图的变化,然后通知数据做改动,这实际上就实现了数据的双向绑定。并且MVVM中的View 和 ViewModel可以互相通信。

MVVM的优点:

MVVM模式的主要目的是分离视图(View)和模型(Model),有几大优点:

  • 低耦合,视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的View上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
  • 可重用性,可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
  • 独立开发,开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xml代码。
  • 可测试,界面向来是比较难于测试的,而现在测试可以针对ViewModel来写
  • 双向数据绑定,它实现了View和Model的自动同步,当Model的属性改变时,不需要手动操作Dom元素,来改变View的显示,而是改变属性后该属性对应View层显示会自动改变

MVVM适用场景: 适合数据驱动的场景,数据操作比较多的场景

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信页面公众号页面 安全键盘收起后键盘下方页面留白

微信浏览器打开H5页面和公众号页面&#xff0c;输入密码时调起安全键盘&#xff0c;键盘收起后 键盘下方页面留白 解决办法&#xff1a; 1、&#xff08;简单&#xff09;只有在调起安全键盘&#xff08;输入密码&#xff09;的时候会出现这种情况&#xff0c;将input属性改为n…

01-自动内存管理机制

一、走进java 每个文件都有自己的格式&#xff0c;java也不例外&#xff0c;而JVM通常是通过16进制对应的java汇编码来解释的&#xff0c; magic&#xff08;魔数&#xff09; 每个Java class 文件的前4个字节被称为他的魔数&#xff08;magic number&#xff09;&#xff1a;…

ASCII 码对照表详解

原文 https://baijiahao.baidu.com/s?id1704767913015693638&wfrspider&forpc 其实大家都知道计算机是老美发明的&#xff0c;当初人家并没有考虑后来需要增加那么多字符&#xff0c;比如中国的汉字&#xff0c;那么早期的美国常用字符&#xff0c;用 1 个字节的前 7…

Unity设计模式——建造者模式

Product类——产品类&#xff0c;由多个部件组成。 class Product {IList<string> parts new List<string>();//添加产品部件public void Add(string part){parts.Add(part);}public void Show(){foreach (string part in parts){Debug.Log("产品:"pa…

python关联分析实践学习笔记

曾经有个沃尔玛超市&#xff0c;它将啤酒与尿布这样两个奇怪的东西放在一起进行销售&#xff0c;并且最终让啤酒与尿布这两个看起来没有关联的东西的销量双双增加。 我们关注的是在这样的场景下&#xff0c;如何找出物品之间的关联规则。接下来就来介绍下如何使用Apriori算法&…

【图像去噪的扩散滤波】图像线性扩散滤波、边缘增强线性和非线性各向异性滤波(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

您需要知道的API基础知识都在这里

API是应用程序编程接口&#xff08;Application Programming Interface&#xff09;的缩写&#xff0c;能够起到两个软件组件之间的连接器或中介的作用。此类接口往往通过一组明确的协议&#xff0c;来表示各种原始的请求和响应。API文档可以向开发人员展示请求和响应是如何形成…

跨境独立站代购中国电商平台商品PHP多语言多货币

跨境独立站代购中国电商平台商品是指代购者在海外建立自己的独立电商平台&#xff0c;代理中国主流电商平台&#xff08;如淘宝、京东等&#xff09;的商品进行销售和代购。这种模式的优势在于代购者可以自主选择产品和价格策略&#xff0c;同时还能提供更专业和优质的服务。 …

【爬虫】python爬虫爬取网站页面(基础讲解)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

亚马逊频繁扫号下的跨境电商,跨境电商卖家应该何去何从?

相信各位同行都知道&#xff0c;自2021年起&#xff0c;亚马逊的扫号活动就从未间断&#xff0c;直到如今2023年的亚马逊&#xff0c;仍然是隔2周-几个月就有大规模的审核扫号&#xff0c;大批卖家店铺被封&#xff0c;亚马逊卖家人人自危&#xff0c;面对时间间隔短频率高的扫…

富文本文案存储翻译方案

一般富文本的功能会有些样式&#xff0c;存储到数据库表里面之后会带上一大堆的标签和样式&#xff0c;底层如果要对这些进行翻译的话会变得非常困难&#xff0c;因为我们要翻译的只是里面的中文内容&#xff0c;这就面临第一个问题&#xff0c;把中文取出来&#xff0c;如果把…

(echarts)饼图封装相关总结及使用

(echarts)饼图封装相关总结 一、封装组件pieCharts.vue <template><div :id"id" :class"className" :style"{ height: height, width: width }" /> </template><script> import echarts from echarts import resize fr…

STM32Cube高效开发教程<基础篇>(三)----STM32CubeMX创建工程

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。    本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。 一、新建项目 …

亚马逊频繁封号,跨境电商卖家如何应对?

相信各位同行都知道&#xff0c;自2021年起&#xff0c;亚马逊的扫号活动就从未间断&#xff0c;直到如今2023年的亚马逊&#xff0c;仍然是隔2周-几个月就有大规模的审核扫号&#xff0c;大批卖家店铺被封&#xff0c;亚马逊卖家人人自危&#xff0c;面对时间间隔短频率高的扫…

WordPress插件 WP-PostViews 汉化语言包

WP-PostViews汉化语言包 WP-PostViews是一款很受欢迎的文章浏览次数统计插件&#xff0c;记录每篇文章展示次数、根据展示次数显示历史最热或最衰的文章排行、展示范围可以是全部文章和页面&#xff0c;也可以是某些目录下的文章和页面。本文还介绍了一些隐藏的功能&#xff0…

【完美世界】石昊偷渡出境四人组产生分歧,云曦和石昊牵手,二人世界要开始了

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析完美世界。 转眼又到完美世界动漫更新日&#xff0c;现在第132集已经更新了了。而这一集看下来&#xff0c;很明显完美世界又进步了&#xff0c;不但剧情紧凑&#xff0c;高潮点也要来了。而这一集看下来信息量也很多&…

k8s 1.28版本二进制安装

本文目录 二进制安装Kubernetes&#xff08;k8s&#xff09;v1.28.0介绍1.环境1.0.环境准备1.Linux网卡没有eth0显示ens33或者其它&#xff08;以ens33为例&#xff09;方法一&#xff1a;修改网卡配置方法二&#xff1a;重新安装机器(本文为虚拟机) 2.克隆的虚拟机&#xff0c…

UE5 Texture2D数组资产BUG!!!

Texture2D数组资产中的元素资产更新后&#xff0c;并未被更新&#xff0c;读取的仍然是之前缓存的Texture2D&#xff0c;需要手动清除后再手动设置新的Texture2D&#xff0c;才能生效&#xff01;&#xff01;&#xff01; 说明&#xff1a;Texture2D数组资产中的后期参数高于…

vmware vsphere用户权限分级

组或用户创建 在“系统管理→Single Sign On→用户和组”中“用户”选项卡中的“域”下拉列表中选择vSphere.local&#xff0c;单击“添加用户”。 权限分配 “系统管理→访问控制→角色”中查看或分配权限。 分类 1、管理员&#xff1a;具有完全的权限&#xff1b; 2、只…

当多条折线数据渲染在一个echarts里,这些折线的x轴数据是不统一的,处理方法

文档中series可以写成[[x轴值&#xff0c;y轴值],[x轴值&#xff0c;y轴值],[x轴值&#xff0c;y轴值]] 这种形式&#xff0c; 如果写成这样那么x轴会以series数组第一个子数组的x轴值的范围来定义&#xff0c;所以大家可以在给series赋值之前排个序&#xff0c;将子数组最多的…