学前端框架之前,你需要先理解 MVC

MVC 软件架构设计模式鼎鼎大名,相信你已经听说过了,但你确定自己已经完全理解到 MVC 的精髓了吗?

如果你是新同学,没听过 MVC,那可以到网上搜一些文章来看看,不过你要有心理准备,那些文章大多都是偏后端的文章,而且大多都是概念性的,看完估计还是会一头雾水。

最终的结果就是,你可能会认为 MVC 模式是属于后端领域的,前端可能更应该去看 MVVM

MVC 模式有一些变体,比如 MVVM、MVP 等等,但不管怎么变化,核心还是不变的,因此我们不需要管那么多概念上的弯弯绕绕,学习 MVC 的核心才是最主要的。

另外,MVC 是软件设计模式,设计模式是不区分语言的,所以也不是后端领域独有的。

实际上,我们前端开发的代码设计模式基本就是 MVC,这点后面我会说到。

因此,理解 MVC 对你来说至关重要,是最重要的基础之一,你对 MVC 的理解会影响到以后你的代码设计质量

另外,前端框架有非常多,理解 MVC,能够帮助你更好地分类并理解这些前端框架。

因此,在学前端框架之前,你需要先理解 MVC

什么是 MVC

MVC 全称是 Model-View-Controller,顾名思义,它是由以下 3 部分组成:

  • Model:模型,你可以理解它是我们代码中的逻辑数据实体
  • View:视图,你可以理解它是用户看到的 UI 界面
  • Controller:控制器,你可以理解它是用来协调(解耦)Model 和 View 的。

MVC 的核心思想就是解耦 Model 和 View

好了,MVC 的概念讲完了,就是这么简单,但有效。

MVC 的好处

听完概念,你可能会问,解耦 Model 和 View 有什么用呢?

我举一个栗子说明一下这里的好处。

假设我们维护一个电商平台,我们的商品卡片需要展示商品价格,类似下图:

在这里插入图片描述

商品卡片左下角的价格数据是从我们的接口返回的。

如果只有 MV 没有 C

我们先来看,如果只有 Model 和 View,没有 Controller 来进行解耦的话,会是这样:

在这里插入图片描述

在拿到接口数据之后,就把接口的数据直接传入给 UI 组件,UI 组件把这个价格原样展示出来。

可以看到,现在 price 字段返回的是浮点数,我们都知道,浮点数的计算非常麻烦,会有精度的问题。一般我们要处理浮点数运算,其中一个办法就是先把浮点数转成整数,运算之后,再把整数转回浮点数。

现在,后端同学因为浮点数计算的问题,对后端逻辑进行了整数化改造优化,接口返回的数据发生了变更,变成了这样:

在这里插入图片描述

price 字段返回了整数,同时也返回了放大倍数 base 字段,这样,当我们需要展示真实的价格时,用放大倍数字段处理一下就可以了。

然后业务又来了一个新的需求,就是这个店铺上线了分期付款功能,用户可以支付较小的一笔钱就能先拿到商品的使用权,后面再每个月支付剩余的钱,直到全部钱都付完为止。为了吸引用户,价格当然是显示地越少越好啦,因此产品希望我们给这个商品的价格显示每期支付的价格,比如下图这样:

在这里插入图片描述

接口又新增了一个 tenor 参数,代表这个商品可使用的分期数,这样做一定的计算之后,就能得到商品的每一期需要支付的价格,然后显示在商品卡片上。

上面这个例子是个极其简单的例子,但却是我们真实工作当中最经常碰到的事情 —— 迭代和变更。上面描述了 2 个功能迭代,可以看到,每次新功能迭代,我们的接口数据 (Model) 和 UI 组件 (View) 都要发生变更,在图中我用红色标记出来了。

可以看到,只要 Model 发生变更,我们的 View 就要跟着一起变更,在我们的例子中,就是全部模块都要变更,这是一件令人烦恼的事情。在真实项目中,当你接到一个需求,发现要在所有模块都修改代码的时候,是非常容易崩溃的。而且,这样的变更,非常容易出问题,然后带来一系列糟糕的影响,比如低绩效,被刀等等。

如果是 MVC 会怎么样

如果我们添加一个 Controller,会变成这样:

在这里插入图片描述

商品价格就是纯透传,没干什么事情。然后我们来看看放大倍数迭代:

在这里插入图片描述

我们在 Controller 处理好价格的转换逻辑,然后再传给商品卡片组件,组件还是跟之前一样,传入什么价格,直接显示就好了。

然后再看看分期迭代:

在这里插入图片描述

同样的,我们在 Controller 处理好分期价格的处理逻辑,然后把处理之后的价格信息传给商品卡片组件就行了。

从上图可以直观地看到,我们在 Model 和 View 之间添加了 Controller,这样就解耦了 Model 和 View。当 Model 发生变更的时候,所有的变更处理都收拢在 Controller,而不需要变更 View。

可能刚入门的同学会问,如果统计图中红色色块的数量,那不是一样的吗?这里只是把过去在 View 中的代码抽到 Controller 这里而已,当 Model 发生变更的时候,Controller 也是一样要跟着变更的,代码量也没变呀。

单看这个简单例子的表现是这样的,好像并没有很神奇的优化效果。但你要记住的是:UI 组件的维护成本 >> 纯逻辑的维护成本

由于篇幅问题,这里就不太好展开来讲了,如果你是新同学,没有比较多的项目维护经验的话,那只需要记住这句话,还有下面这些优势项就好:

  • MVC 让 UI 与 逻辑 解耦,这样 UI 组件更加单一,UI 组件专心处理样式,交互和终端兼容性问题即可。
  • MVC 让 UI 与 逻辑 解耦,这样 UI 组件更容易被复用。就像上面的例子一样,这个组件的功能就是展示价格,不管这个价格是什么,那么所有需要展示价格的地方都能使用这个组件。但是如果没有 Controller 解耦,那 UI 组件就会变得非常臃肿,要传入更多的参数才能使用这个组件,复用度就会很低。
  • 纯逻辑的代码更容易被单测,相对于 UI 组件来说。UI 和逻辑耦合严重的代码无法被单测。
  • 纯逻辑可以被进一步拆分解耦,从而提升逻辑的复用度。上面的例子也展示了这一点,我们可以划分更细的 Controller,比如处理浮点数放大的 Controller、处理分期价格计算的 Controller 等等,而这些 Controller 也可以被其他场景复用。

在了解 MVC 的好处之后,让我们来看看,MVC 具体是怎么应用的。

后端服务中的 MVC

在这里插入图片描述

上面画了个简单的草图,现在后端流行微服务,基本上,每个后端服务都是一个简单的 MVC 架构:

  • Model 层:主要是数据层,这些数据可以是从 DB 映射过来,也可以是从其他的数据源获取,也可以从另外一个服务请求过来。
  • Controller 层:主要是逻辑层,负责处理 Model 层的数据,加工处理之后,返回给 View 层使用。
  • View 层:现在的后端并不关心 UI 展示,这些都是由前端来做的,因此,对于后端来说,他们的 View 就是需要返回给前端的 Restful API 的数据。这是因为前后端分工而演变成现在这个样子的,在过去 (十几年前),前端还没那么流行的时候,后端开发是要把前端的活也干了的,他们在 Controller 层就要把页面拼接出来,当时比较流行的是 JSP,感兴趣的话可以去查一下了解。其实,对于我们前端来说,这个架构放在 Node 服务会更容易理解,我们的服务端渲染的服务,就是在 Controller 层把 HTML 文件的内容拼接出来,然后返回给浏览器。

后端的应用简单了解一下就好了,还是回到我们的正题,MVC 在前端领域中是怎样应用的呢?

前端领域的 MVC

在这里插入图片描述

实际上,当我们在开发页面的时候,应用 MVC 来设计我们的代码是比较合理的,这样设计的代码天然就更好被维护。

首先是 Model,我们可以把后端提供的数据接口看做 Model 层。当然,在一些大型应用中,逻辑异常复杂,数据繁多,很容易出现问题,因此,我们还会专门设计一层 Model 层,封装后端提供的原始数据,给页面应用提供统一规范的 Model 数据实体。

其次是 Controller,我们页面需要的核心逻辑,都应该抽离出来,成为一个个 Service 和 Controller。这些逻辑专门加工处理 Model 层的数据,转换成 UI 需要用到的数据。可以看到,这一层最核心的就是对数据的处理,比如如何触发数据的变更和数据的传递的。在这一层,有非常多的框架,比如 Redux/dvaVuexMobxzustand 等等。

最后是 View,也就是我们最常见的 UI 组件。当我们把逻辑从 UI 组件抽离出来之后,UI 组件就会变得纯粹,甚至有很多是静态组件,它们就更容易被复用。UI 组件最核心的职责就是如何把传入的数据正确地渲染到界面中,并跟用户进行交互。因此,View 层最核心要关注的是跟客户端打交道,比如前端开发接触最多的浏览器,我们要关注 HTMLCSSDOMBOM、浏览器兼容性、移动端响应式等等。在这一层,最出名的框架就是 ReactVue 了。

结语

就像之前的那个例子一样,太多的前端开发没有应用 MVC 思想去设计自己的代码,最终写出 MV 的代码,导致自己虽然使用了现代化的 UI 框架,强制实现了组件化,但那些组件都是不可复用,维护困难,一叠加功能就出问题。

究其本质,就是因为不理解 MVC 软件架构设计模式,并应用到自己的代码设计之中。

其实,MVC 思想并不复杂,它的核心就只是解耦,解耦 Model 和 View。只要你理解了这个核心,并多加练习,让它成为你的编码设计习惯,你就能写出高质量的代码。

其实,我们前端开发的日常工作就是 MVC

  • 获取数据 (Model),处理这些数据 (Controller),把加工后的数据展示到界面上 (View)
  • 另外一个方向是:捕获用户在界面上的交互行为 (View),这个交互对数据会产生什么影响 (Controller),把最新的数据提交给后端 (Model)

了解这个 MVC 之后,就可以帮助你分类并理解后面需要学习的前端框架了:

  • 有什么工具、方法、框架可以帮助我更好地获取各种格式的数据?定义这些数据?提交这些数据?
  • 有什么框架、设计模式可以帮助我更好地维护大量地、各种格式的数据关系?让数据变更更加有序?让处理数据的逻辑更加解耦和可复用?
  • 有什么框架、思想可以帮助我更高效地开发 UI 界面?帮我解决兼容性问题?

好啦,MVC 就讲到这里,希望你可以好好理解这个设计思想。接下来我们要学习的前端框架主要是以 View 层为主,Controller 层的框架也会涉及到一些,希望你可以更好地区分这些框架,明确它们的作用和应用领域。

----------------【END】----------------

如果你是真心喜欢前端,并相信成长,想要提升自己的话,欢迎加入之道前端学习圈子。

戳这里 免费获取 之道前端的学习资料和专属服务。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第十八章 视图

目录 一、概述 二、语法 2.1. 创建视图 2.2. 查询视图 2.3. 修改视图 2.4. 删除视图 2.5. 示例 三、检查选项 3.1. CASCADED(级联) 3.2. LOCAL(本地) 四、视图的更新 五、视图作用 5.1. 简单 5.2. 安全 5.3. 数据独…

【MySQL】第一弹---MySQL 在 Centos 7环境安装

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】 目录 1. 卸载不要的环境 2. 检查系统安装包 3. 卸载这些默认安装包 4. 获取mysql官方yum源 5. 安装mysql yum 源&am…

实验2 词法分析(一)

实验2 词法分析(一) [实验目的]: 1 . 熟悉给定的词法分析程序; 2 . 改进词法分析程序。 [实验内容]: 1.运行TESE编译演示.exe,观看词法分析程序的分析过程,理解词法分析的原理。并尝试在“TEST源程序输入框”输入一段…

【PyQt】PyQt工具栏

PyQt工具栏 在 PyQt 中创建工具栏主要涉及 QMainWindow、QToolBar 和 QAction 类 界面展示 基本示例 import sys from PyQt5.QtWidgets import QMainWindow, QApplication, QAction from PyQt5.QtGui import QIcon from PyQt5.QtCore import Qtclass MainWindow(QMainWindow…

STM32 串口收发数据包

接线图 HEX数据包接收 文本数据包接收 代码配置 发送HEX数据包 //存储发送或接收的载荷数据 uint8_t TX_Packet[4]; uint8_t RX_Packet[4];void Serial_SendPacket(void) {Serial_SendByte(0xFF);//发送包头Serial_SendArray(TX_Packet, 4);//发送4个载荷数据Serial_SendByte…

zabbix5.0.46版本源码安装

zabbix5.0.46版本源码安装 1.安装环境说明 本例中安装zabbix开源软件和zabbix运行所需的中间件和数据库apache、php和flyingdb,软件版本信息如下: 软件版本zabbix5.0.46apachehttpd-2.4.61aprapr-1.7.5apr-util1.6.3php7.3.24PostgreSQL16.6 主机操作…

[Android] IKTV专享版

[Android] IKTV专享版 链接:https://pan.xunlei.com/s/VOILXXuEd3ASo93c88UW79sxA1?pwd4tsw# 2025年2月最新免费K歌神器!家庭KTV软件,手机平板电视盒子电脑都可用

【OS】AUTOSAR架构下的Interrupt详解(下篇)

目录 3.代码分析 3.1中断配置代码 3.2 OS如何找到中断处理函数 3.3 Os_InitialEnableInterruptSources实现 3.4 Os_EnableInterruptSource 3.5 DisableAllInterrupts 3.5.1Os_IntSuspendCat1 3.5.2 Os_InterruptDisableAllEnter 3.5.3 Disable二类中断 3.5.4 Disable一…

flutter 专题四十七 Flutter 应用启动流程分析

众所周知,任何应用程序的启动都是从main()函数开始的,Flutter也不例外,main.dart文件的main函数开始的,代码如下。 void main() > runApp(MyApp());main函数则调用的是runApp函数,源码如下。 void runApp(Widget …

html中的表格属性以及合并操作

表格用table定义,标签标题用caption标签定义;用tr定义表格的若干行;用td定义若干个单元格;(当单元格是表头时,用th标签定义)(th标签会略粗于td标签) table的整体外观取决…

大语言模型轻量化:知识蒸馏的范式迁移与工程实践

大语言模型轻量化:知识蒸馏的范式迁移与工程实践 🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 摘要 在大型语言模型&#xff…

Go语言的转义字符

文章目录 1. Go语言的转义字符(escapechar)2. 小结和提示 1. Go语言的转义字符(escapechar) 说明:常用的转义字符有如下: \t : 表示一个制表符,通常使用它可以排版\n :换行符\\ :一个\\" :一个"\r :一个回…

Docker深度解析:容器与容器局域网

DockerFile 解析: DockerFile 描述出镜像文件需要的一些依赖配置和环境变量执行命令 docker build,将我们的 dockerfile 文件打包成一个镜像文件直接使用我们的容器运行到该镜像文件 CentOS 镜像: 运行镜像: docker run -it cent…

360手机刷机 360手机解Bootloader 360手机ROOT

360手机刷机 360手机解Bootloader 360手机ROOT 问:360手机已停产,现在和以后,能刷机吗? 答:360手机,是肯定能刷机的 360手机资源下载网站 360手机-360手机刷机RootTwrp 360os.top 360rom.github.io 一、…

C++输入输出(上)

cin和cout cin是C中提供的标准输入流对象,一般针对的是键盘,也就是从键盘上输入的字符流,使用 cin来进行数据的提取,cin一般是和 >> (流提取运算符) 配合使用的。 cin的功能和scanf是类似的 cout是C中提供的标准输出流对象,一般针对的是控制台的窗口,也就是将数据以字符…

【沐风老师】3DMAX混沌破碎插件ChaosFracture使用方法

3DMAX混沌破碎插件ChaosFracture,只需一键操作,即可轻松实现物体的破碎效果,同时确保外表面与内部断裂部分保持原有的材质ID和UVs信息,真实呈现细腻的破碎场景。 【适用版本】 3DMax9及更高版本(建议使用3DMax2018以上…

e2studio开发RA2E1(8)----GPT定时器频率与占空比的设置

e2studio开发RA2E1.8--GPT定时器频率与占空比的设置 概述视频教学样品申请硬件准备参考程序源码下载选择计时器时钟源PWM(脉冲宽度调制)R_GPT_PeriodSet()函数说明R_GPT_DutyCycleSet()函数说明R_GPT_Reset()函数说明R_GPT_Close() 函数说明主程序波形情况 概述 GPT&#xff0…

7.PPT:“中国梦”学习实践活动【20】

目录 NO1234​ NO5678​ NO9\10\11 NO1234 考生文件夹下创建一个名为“PPT.pptx”的新演示文稿Word素材文档的文字:复制/挪动→“PPT.pptx”的新演示文稿(蓝色、黑色、红色) 视图→幻灯片母版→重命名:“中国梦母版1”→背景样…

基于Flask的大模型岗位招聘可视化分析系统的设计与实现

【FLask】基于Flask的大模型岗位招聘可视化分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为主要开发语言,结合Echarts可视化库&#xff0…

AlwaysOn 可用性组副本所在服务器以及该副本上数据库的各项状态信息

目录标题 语句代码解释:1. `sys.dm_hadr_database_replica_states` 视图字段详细解释及官网链接官网链接字段解释2. `sys.availability_replicas` 视图字段详细解释及官网链接官网链接字段解释查看视图的创建语句方法一:使用 SQL Server Management Studio (SSMS)方法二:使用…