阐述 MVC 模式
1, MVC与MVVM
MVC 他是后端的一个开发思想
MVVM是基于MVC中的view这层所分离出来的一种设计模式。

MVC架构详解

MVC(Model-View-Controller)是一种广泛使用的软件设计模式,主要用于分离应用程序的业务逻辑、用户界面和输入控制。这种架构通过将应用划分为三个主要部分——模型(Model)、视图(View)和控制器(Controller),从而实现了清晰的功能划分2

模型(Model)

模型负责管理数据以及与数据库或其他持久化存储交互的逻辑。它是应用程序的核心,包含了所有的业务逻辑和数据操作方法。无论是在桌面应用还是Web应用中,模型都充当着数据提供者的角色。例如,在J2EE环境中,模型可能涉及DAO(Data Access Object)层的设计,用于执行CRUD(Create, Read, Update, Delete)操作1

视图(View)

视图是用户看到并与之交互的部分。它的职责仅限于展示来自模型的数据给用户,并允许用户触发事件以便更新这些数据。在现代Web开发中,HTML页面通常作为视图的一部分存在,而JavaScript框架则进一步增强了动态效果和支持异步通信的能力4

控制器(Controller)

控制器充当中介的角色,接收用户的输入并调用相应的模型组件去处理该请求,然后再决定显示哪个视图来响应客户端。具体来说,当用户提交表单或者点击链接时,HTTP请求会被发送到服务器端的一个特定控制器实例上;此实例会解析这个请求并将必要的信息传递给模型进行加工后再返回结果给前端渲染成最终呈现出来的网页内容

  • MVC与MVVM思想
  • 项目结构与文件类型
  • 全局标题与页面标题
  • 全局样式与页面样式
  • App 的生命周期
  • 页面的声明周期
  • 数据绑定与事件
  • 组件中的动态与静态变量
  • 条件判断与for循环
  • 多端兼容条件编译
MVC模式
1,M: model-模型层,数据的增删改查
2, V: view-视图层, 前端页面(html/javascript/css)
3, C: controller-控制层,处理业务

比如说现在有一个订单,用户要去下订单,要去支付的话,肯定要去创建一个订单,那么在页面上用户会触发一个点击事件下单,随后页面就会触发一个事件,在页面里面他就是一个view,通过事件触发以后,事件会达到我们后端,后端再我们路由配置里会接收到用户的请求,用户的请求,请求到我们的后端,要去执行哪一个方法,哪一个controller,或者说是Ajax,是由路由所去控制的,路由拿到请求去分析之后,他是一个request请求映射,映射到我们某一个控制器,就会直接把用户的请求丢到控制器,让我们的控制器去针对我们用户请求去做相应的处理。

路由: 只处理用户的请求,拿到请求然后直接丢给我们的控制器,他不做额外的处理,仅仅负责页面导向作用。我们业务处理完毕了,要针对订单去做保存。

记录数据,通过model层,去做一个相应的增加操作,可以去增加一条日志,可以去增加一条订单,数据都会保存在我们数据库里面,随后,我们要去做一个查询操作,也就是说,我们虽然把数据插入到数据库,我们还会去查询一下最新增加的数据,这个查询操作也是在model层去做的,其实 model 层就是我们的数据库,那么最后处理完毕之后,拿到了相应的用户所需要的一些信息之后,他会在返回到我们的控制器,返回给controller,随后再去进行相应的业务处理,最后包装完毕数据之后,然后再抛给我们的view,跑到页面上去做一个渲染,以上整个过程就是MVC的处理过程。

这是我们后端开发要使用的一种开发思想,设计模式。

什么是MVVM?

MVVM 是一种软件架构模式,用于将应用程序的用户界面(View)与数据和业务逻辑(Model)进行分离。MVVM 的核心思想是通过一个称为 ViewModel 的中间层来连接 View 和 Model。
M:Model(模型)代表应用程序的数据和业务逻辑。它负责数据的获取、处理和存储,以及定义应用程序的行为。
V:View(视图)代表应用程序的用户界面。它负责展示数据和与用户进行交互,通常由 HTML、XML 或其他类似的标记语言编写。
VM:ViewModel(视图模型)它是 View 和 Model 之间的连接层。ViewModel 处理用户界面上的事件和输入,并将它们转化为对 Model 的操作。它还负责从 Model 中获取数据,并将数据绑定到 View 中,使得数据的变化能够自动更新到用户界面上。

​ ​ 记录数据通过model层去做一个相应的增加操作,可以去增加一条日志,可以去增加一条订单,数据都会保存在我们数据库里面,随后,我们要去做一个查询操作,也就是说,我们虽然把数据插入到数据库,我们还会去查询一下最新增加的数据,这个查询操作也是在model层去做的,其实model层,就是我们的数据层,那么最后处理完毕之后,拿到了相应的用户所需要的一些信息之后,它会再返回到我们的控制器,返回给controller,随后再去进行相应的业务处理,最后,包装完毕数据之后,然后再抛给我们的view,跑到页面上去做一个渲染,以上整个过程就是MVC的处理过程。

这里的view是指的是我们视图层里面的一个页面
model 每一个页面里面存在的数据
查询用户订单,订单的数据就是我们的model,用户要去注册或者修改个人信息,那么我们的model,他就是一个JSON对象,也就是说,我们所有的需要再页面里面去展示,去渲染的那些数据都是我们的model,假设我们现在还是使用的时 js/jquery的操作方式。
使用原生的js/jquery去操作我们的DOM,这时比如说用户是在做修改个人信息,那么此时修改之后我们首先
第一步, 我们要去获取用户现有的个人信息,获得了个人信息以后,我们发送给Ajax到后端,获得相应的 JSON对象,JSON对象此时就在我们的Model里面,在Model里面以后,我们是需要把里面的数据渲染到页面里面去,而且我们会写一个相反的方法。
比如说从model获取到相应的字段,有用户的昵称,用户的性别,用户的喜好等等我们都可以获得,一个个都把他渲染到页面的,每一个相应的组件里面去,这个过程其实就是我们使用js/jquery的一种方式
另外,当我们把数据渲染到页面里面去之后,用户去做修改,然后提交,那么用户修改的时候,监听用户的一个动作,用户修改了文本框view,我们都会去写相应的方法,把这些数据重新拿到手或者说把相应的内容封装到我们的model里面去,这个过程,我们需要额外去写一个方法的,当然我们也可以去使用form表单,把form里面的数据序列化成一个对象,随后我们再提交到去做一个修改的操作,这是我们已经操作过的方式。我们要使用MVVM这样一个模式的时候,我们就不再使用js/jquery以前的这种方式,不去操作DOM,此时我们引入一个新的概念,则是view/model他是一个核心调度者协调器,他是专门在中间做数据的传递工作的,比如我们现在拿到用户的数据以后不是直接交给view去渲染,我们自会把相应的数据丢给 View Model(VM)让VM去做渲染的动作,随后我们的数据就会去HTML页面做相应渲染,随后用户去到我们页面里面操作了,其他的DOM的一些元素修改了一些数据,此时,我们开发者不需要额外的去写相应的方法,只要用户修改了数据,相应的数据就会通过View Model再去传递到我们的Model,这整个两个方向的动作,其实都是由我们的VM调度器去做相应的处理,对于这样的操作,我们称之为数据双向绑定,这整个过程就是我们MVVM的设计思想,是一种开发模式。
template 里面使用的视图组件view,相当于我们使用的dir.
通过代码阐述MVVM与双向绑定
注意:一个页面只能有一对template,script,style标签
template 代表的就是一个页面 view
script标签里面的export default {} 固定的默认写法,他是一个实例,他也是一个对象,他就是我们的协调者,调度器,就是VM
MVVM (Model-View-ViewModel)是一种用于构建用户界面应用程序的设计模式,现常用于在桌面、移动和Web应用程序开发中。通俗地讲,它可以理解为MVC的改进版,把MVC中的V(View)的状态和行为抽象化,把视图UI与业务逻辑分开。
一,MVVM 核心三组件
1. M:模型(Model) :对应 data 中的数据2. V:视图(View) :模板3. VM:视图模型(ViewModel) : Vue 实例对象如下图所示结构:

模型(Model):代表应用程序的数据和业务逻辑。Model负责数据的存储、检索和操作,但不直接与用户界面交互。可以理解为厨房。厨房负责准备食物。厨师们(数据)知道如何制作各种菜肴(业务逻辑)。他们不直接和顾客交流,而是通过服务员来传递食物。
视图模型(ViewModel):作为Model和View之间的桥梁,ViewModel负责转换Model中的数据,使其更适合在View中显示。ViewModel还处理用户的输入,并将这些输入转换为对Model的操作。ViewModel监听Model中数据的变化,并将这些变化通过数据绑定传递给View。可以理解为服务员。服务员是连接厨房和餐厅的桥梁。他们从厨房(Model)获取食物,然后端给顾客(View)。同时,他们也会把顾客的需求(比如加辣、少盐)传达给厨房。服务员确保顾客的需求被正确理解和满足。
视图(View):代表用户界面,负责向用户展示数据和接收用户的输入。View通过数据绑定与ViewModel交互,当ViewModel中的数据发生变化时,View会自动更新以反映这些变化。同时,View也可以监听用户的交互(如点击按钮),并将这些事件传递给ViewModel处理。 可以理解为餐厅。餐厅是顾客用餐的地方,相当于用户界面。顾客在这里点菜(用户输入),并享用食物(查看数据)。餐厅的服务员(View的代码)会将顾客的订单(用户操作)传递给厨房,并将做好的菜肴(数据显示)端给顾客。二,数据绑定与事件绑定图中箭头表示数据和事件的流向:数据绑定:ViewModel和View之间的数据是双向绑定的,即ViewModel中的数据变化会自动更新到View,View中的用户输入也会自动更新到ViewModel。事件绑定:View中的用户交互(如按钮点击)会触发ViewModel中的命令或方法,从而更新Model中的数据。

代码解释:
<!-- <template><script><style> 这三个标签在每个页面都只能存在一个 -->
<!-- template: View这层 代表的只是一个页面 -->
<template><view class="content"><image class="logo" src="/static/logo.png"></image><view class="text-area"><text class="title">{{title}}</text><input type="text" :value="title" @input="change" /></view></view>
</template><script>// VM 协调者,调度者export default {// Model 所有的数据data() {return {title: 'Hello NEXT 学院'}},onLoad() {},methods: {change(e) {var txtTitle = e.detail.value;this.title = txtTitle;}}}
</script>代码解释:
template: 代表一个页面  View
script: 代表协调者调度器  VM(View Model)
export default{} 
固定的默认写法,他是一个实例,他也是一个对象,他就是我们的一个协调者调度器
只要是在我们的data(){}里面写了相应的数据,数据就可以通过我们的View进行数据渲染,渲染到我们的页面里面去
然后再我们data(){}里面需要注意的,每一个data他都会return{}一个对象,return对象里面就是我们开发者所需要去写的所有数据,在return{}对象里面,不管你去写一个字符串,还是一个int型的,还是整型,数组,对象,都是没有问题,
我们这里<script>中的View Model(VM),和我们<template>中的View进行了相应的陈述,并且我们相应的数据只要去data(){}里面去写上,某一个对应的属性,就可以做到相应的渲染,如果我们按照以往的开发模式,要去手动的去操作DOM的话,我们首先需要去获取text这个标签,获取后通过 innerHTML相应的DOM的值赋上去,这样一次操作,我们现在是不需要的,因为我们的VM是不需要手动去操作DOM,下面我们来写一个小例子。<input type="text" :value="title" />:value="title" 是vue.js中的一个写法,表示只要在 value 前面加上 : 我们当前value的值就会和data(){}里面的属性,比如 "title" 进行关联,这是需要做一个理解的。@ 	// 所有的事件都以@开头methods: {} // 用户所有的自定义方法都写到这里
MVVM与双向绑定 实现代码
pages/index/index.vue
<!-- <template><script><style> 这三个标签在每个页面都只能存在一个 -->
<!-- template: View这层 代表的只是一个页面 -->
<template><view class="content"><image class="logo" src="/static/logo.png"></image><view class="text-area"><text class="title">{{title}}</text><input type="text" :value="title" @input="change" /></view></view>
</template><script>// VM 协调者,调度者export default {// Model 所有的数据data() {return {title: 'Hello NEXT 学院'}},onLoad() {},methods: {change(e) { // e是触发事件var txtTitle = e.detail.value; // value是detail里面的一个属性this.title = txtTitle; // 覆盖data(){}里面现有的数据}}}
</script><style>.content {display: flex;flex-direction: column;align-items: center;justify-content: center;}.logo {height: 200rpx;width: 200rpx;margin-top: 200rpx;margin-left: auto;margin-right: auto;margin-bottom: 50rpx;}.text-area {display: flex;justify-content: center;}.title {font-size: 36rpx;color: #8f8f94;}
</style>
components 组件
让用户去构建一些相应的自定义组件的时候,我们会把这些内容组件一个一个放到文件夹之内。在我们项目里面,我们也会涉及到一个自定义的组件,那么我们就会把自定义的组件的一些页面,内容,都会放在这个目录之下的。随后,将来的组件就可以让其他页面去调用了。

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

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

相关文章

智慧收银系统开发进销存库存统计,便利店、水果店、建材与家居行业的库存汇总管理—仙盟创梦IDE

在零售与批发行业的数字化转型中&#xff0c;当前库存汇总作为进销存管理的核心环节&#xff0c;直接影响着企业的资金周转、销售决策和客户满意度。现代收银系统已超越传统的收款功能&#xff0c;成为整合多渠道数据、实现实时库存汇总的中枢神经。本文将深入剖析便利店、水果…

selenium(WEB自动化工具)

定义解释 Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google Chrome&#xff0…

windows本地使用conda部署Open-webui

前提条件 Open-webui使用python3.11.9 步骤 conda操作也可以参考 安装python torch、transformer、记录 1、conda环境 # 创建环境 conda create --name openwebui python3.11.9# 激活环境 conda activate openwebui# 升级pip版本 pip install --upgrade pip# pip安装openwe…

【Unity笔记04】数据持久化

&#x1f31f; 方案核心思想遵循以下设计原则&#xff1a;数据安全第一&#xff1a;绝不使用明文存储&#xff0c;采用AES加密算法保护数据。性能优化&#xff1a;使用异步I/O操作&#xff0c;避免阻塞主线程导致游戏卡顿。结构清晰&#xff1a;模块化设计&#xff0c;职责分离…

深入理解 HTML5 Web Workers:提升网页性能的关键技术解析

深入理解 HTML5 Web Workers&#xff1a;提升网页性能的关键技术解析引言1. 什么是 Web Workers&#xff1f;Web Workers 的特点&#xff1a;2. Web Workers 的使用方式2.1 创建一个 Web Worker步骤 1&#xff1a;创建 Worker 文件步骤 2&#xff1a;在主线程中调用 Worker3. W…

会议室预定系统核心技术:如何用一行SQL解决时间冲突检测难题

文章目录 一、为什么时间冲突检测是预定系统的核心挑战? 二、黄金法则:两行线段重叠检测法 三、四大冲突场景实战解析(同一会议室) 四、生产环境完整解决方案 1. 基础冲突检测函数 2. 预定API处理流程 3. 高级边界处理技巧 五、性能优化关键策略 六、不同数据库的适配方案 …

13.正则表达式:文本处理的瑞士军刀

正则表达式&#xff1a;文本处理的瑞士军刀 &#x1f3af; 前言&#xff1a;当文本遇上神奇的密码 想象一下&#xff0c;你是一个图书管理员&#xff0c;面对着一堆乱七八糟的书籍信息&#xff1a; “联系电话&#xff1a;138-1234-5678”“邮箱地址&#xff1a;zhang.sangm…

linux下c语言访问mysql数据库

一、连接数据库基础1. 头文件与库文件连接 MySQL 需包含的头文件&#xff1a;#include <mysql/mysql.h> // 部分环境也可用 #include <mysql.h> 编译链接时&#xff0c;Linux 平台需指定库名&#xff1a;-lmysqlclient &#xff0c;用于链接 MySQL 客户端函数库。2…

6. 传输层协议 UDP

传输层负责数据能够从发送端传输接收端.1. 再谈端口号端口号(Port)标识了一个主机上进行通信的不同的应用程序在 TCP/IP 协议中, 用 "源 IP", "源端口号", "目的 IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信…

vue 开发总结:从安装到第一个交互页面-与数据库API

vue 总结 1、安装vue&#xff1a; WinR 输入&#xff1a;cnpm install -g vue/cli 验证是否安装成功&#xff1a;vue --version 2、新建Vue工程 在对应文件夹下右击打开集成终端 输入 vue create query_system&#xff08;新建项目名字&#xff09;名称不能存在大写&#x…

运维笔记:HTTP 性能优化

一、HTTP 协议特性与性能瓶颈1.1 HTTP 协议发展历程HTTP 协议的演进直接影响着 Web 性能&#xff0c;各版本关键特性对比&#xff1a;协议版本发布时间核心特性性能优势局限性HTTP/1.01996 年无状态、短连接简单易实现每次请求需建立 TCP 连接HTTP/1.11999 年长连接、管道化减少…

ubuntu:运行gcfsd-admin守护进程需要认证,解决方法

这里有个锁子&#xff0c;每次进入都要输入密码&#xff0c;怎么解决&#xff1f; 重新挂载 /data 磁盘 sudo umount /data sudo ntfsfix /dev/sda1 sudo mount -o rw /dev/sda1 /data

1.DRF 环境安装与配置

文章目录一. Django Rest_Framework二、环境安装与配置2.1 安装 DRF2.2 创建Django项目2.3 添加 rest_framework 应用三、启动项目一. Django Rest_Framework 核心思想&#xff1a;大量缩减编写 api 接口的代码 Django REST framework 是一个建立在 Django 基础之上的 Web 应…

设计模式(十九)行为型:备忘录模式详解

设计模式&#xff08;十九&#xff09;行为型&#xff1a;备忘录模式详解备忘录模式&#xff08;Memento Pattern&#xff09;是 GoF 23 种设计模式中的行为型模式之一&#xff0c;其核心价值在于在不破坏封装性的前提下&#xff0c;捕获并外部化一个对象的内部状态&#xff0c…

Qt/C++开发监控GB28181系统/录像回放/切换播放进度立即跳转/支持8倍速播放/倍速和跳转进度无缝切换

一、前言说明 在国标监控系统中&#xff0c;录像回放过程中&#xff0c;需要切换播放进度&#xff0c;对比过很过国标系统&#xff0c;绝大部分尤其是网页版的监控系统&#xff0c;在切换进度过程中都会黑屏&#xff0c;这个体验就很不友好了&#xff0c;明明gb28181协议中就有…

【11】大恒相机SDK C++开发 ——原图像数据IFrameData内存中上下颠倒,怎么裁剪ROI 实时显示在pictureBox中

文章目录3 当内存中的 图像数据是垂直翻转的时候怎么截取ROI 并显示3.1 对ROI在原图中的位置做转换3.2 将ROI的最后一行当做开始位置&#xff0c;从底部向上复制数据3.3 完整代码3.4 图像数据在内存中上下颠倒的情况3.5 调用验证4 unsafe代码 解释及注意事项 看我另一篇文章5 C…

小架构step系列29:校验注解的组合

1 概述如果遇到某些属性需要多种校验&#xff0c;比如需要非空、符合某正则表达式、长度不能超过某值等&#xff0c;如果这种属性只有有限几个&#xff0c;那么手工把对应的校验注解都加上即可。但如果这种属性比较多&#xff0c;那么重复加这些校验注解&#xff0c;也是一种代…

网络基础19:OSPF多区域实验

一、拓扑结构1. 网络拓扑&#xff1a;骨干区域&#xff08;Area 0&#xff09;&#xff1a;连接核心设备&#xff08;AR1、AR2、AR3、AR4、AR5、AR6&#xff09;。非骨干区域&#xff1a;Area 1&#xff1a;AR5 ↔ AR9Area 2&#xff1a;AR5 ↔ AR10Area 3&#xff1a;AR6 ↔ A…

goland编写go语言导入自定义包出现: package xxx is not in GOROOT (/xxx/xxx) 的解决方案

问题 写了个自定义的包 calc.go&#xff0c;在路径 $GOPATH/go_project/src/demo_51_package/com/目录下&#xff0c;其中main.go 是main方法的入口代码 main.go 代码如下 package main import "demo_51_package/com" func main() {add : calc.Add(1, 2)println(add)…

HLS视频切片音频中断问题分析与解决方案

HLS视频切片音频中断问题分析与解决方案 问题背景 在使用FFmpeg进行HLS视频切片并通过hls.js前端播放时&#xff0c;开发者经常遇到一个典型问题&#xff1a;第一个视频切片播放正常且有声音&#xff0c;但后续切片却突然失去音频。这种现象在直播和点播场景中均有出现&#xf…