v-model与 mvvm 回顾

文章目录

    • v-model 与 mvvm
    • mvvm剖析
    • 发布-订阅,观察者模式

v-model 与 mvvm

  1. 概念理解
    • v-model
      • 定义:在Vue.js中,v-model是一个指令。它主要用于在表单元素(如inputtextareaselect等)和组件上创建双向数据绑定。这意味着当用户在表单元素中输入数据时,对应的Vue实例中的数据会自动更新,反之,当Vue实例中的数据发生变化时,表单元素显示的值也会随之改变。
      • 语法示例:在一个简单的input元素中,v - model的使用如下:
        <input v-model="message" type="text">
        
        在对应的Vue实例中:
        new Vue({el: '#app',data: {message: 'Hello Vue!'}
        });
        
        这里message是Vue实例中的数据属性,v-modelinput元素和message进行了双向绑定。
    • MVVM(Model - View - ViewModel)
      • 定义:MVVM是一种软件架构模式。它主要的目的是将用户界面(View)的开发与业务逻辑(Model)的处理分离开来,通过一个中间层(ViewModel)来进行数据的绑定和交互。在Vue.js中,Vue实例可以看作是ViewModel层。ViewModel负责从Model获取数据并将其提供给View展示,同时它也负责将View中的用户操作反馈给Model进行数据更新。
      • 架构示例
        • Model:可以是一个简单的JavaScript对象,例如:
          const user = {name: 'John',age: 30
          };
          
        • View:是HTML页面中的DOM元素,如:
          <div id="app"><p>{{ user.name }}</p><input type="text" v - model="user.name">
          </div>
          
        • ViewModel:由Vue实例充当,像这样:
          new Vue({el: '#app',data: {user: user}
          });
          
  2. 区别
    • 层次不同
      • v-model是Vue框架中的一个具体指令,它主要关注的是在视图(View)层的表单元素和数据之间建立便捷的双向绑定关系。它是MVVM模式在Vue中实现数据双向绑定的一种具体手段。
      • MVVM是一种架构模式,它涉及到模型(Model)、视图(View)和视图模型(ViewModel)三个层次之间的关系和交互。它是一种更宏观的设计理念,用于组织和管理整个应用程序的结构,使得数据和视图能够有效地分离并且方便地进行交互。
    • 功能范围不同
      • v-model主要用于表单元素的双向数据绑定,功能比较聚焦。例如,它可以很方便地处理用户在inputtextareaselect等表单元素中的输入和数据更新。
      • MVVM涵盖的范围更广,它不仅包括数据绑定(像v - model所做的),还包括数据的获取、处理、存储(Model层),视图的渲染和事件处理(View层),以及中间的协调逻辑(ViewModel层)。例如,在一个复杂的应用中,ViewModel可能会从服务器获取数据(涉及Model),然后将数据处理成适合视图展示的格式,并且处理视图中的各种交互事件。
  3. 应用场景
    • v-model的应用场景
      • 表单处理:在用户注册、登录等表单场景中大量使用。例如,在一个用户注册表单中:
        <form><input v - model="user.username" type="text" placeholder="Username"><input v - model="user.password" type="password" placeholder="Password"><button type="submit">Submit</button>
        </form>
        
        在Vue实例的data中定义user对象来存储用户输入的用户名和密码信息,方便后续的验证和提交操作。
      • 组件数据交互:当开发自定义组件并且需要在组件内部和外部进行数据双向传递时,v - model也非常有用。例如,创建一个自定义的计数器组件:
        <template><div><button @click="decrement">-</button><span>{{ count }}</span><button @click="increment">+</button></div>
        </template>
        <script>
        export default {props: ['value'],data() {return {count: this.value};},methods: {increment() {this.count++;this.$emit('input', this.count);},decrement() {this.count--;this.$emit('input', this.count);}}
        };
        </script>
        
        使用组件时:
        <counter-component v-model="counter"></counter-component>
        
        这里通过v-model实现了组件内部count数据和外部counter数据的双向绑定。
    • MVVM的应用场景
      • 大型单页应用(SPA)开发:在构建复杂的单页应用时,MVVM模式可以很好地组织代码。例如,在一个电商单页应用中,Model层可以处理商品数据的获取(从服务器API获取商品列表、详情等)、用户数据(如用户信息、订单信息)的存储和更新。View层负责展示商品列表、商品详情、购物车界面等各种页面视图。ViewModel层则在中间协调数据和视图的交互,比如根据用户在视图中的操作(如添加商品到购物车)更新Model中的购物车数据,并及时更新视图中的购物车显示。
      • 数据驱动的UI开发:当需要根据数据的变化动态更新UI时,MVVM模式非常合适。比如在一个数据可视化应用中,Model层存储和管理数据(如从数据库或其他数据源获取的统计数据),ViewModel层对数据进行处理和转换,使其适合视图展示(如对数据进行排序、筛选、计算等),View层则根据ViewModel提供的数据进行图表绘制等操作。当数据发生变化时,通过MVVM的机制可以自动更新视图,保持数据和视图的一致性。

mvvm剖析

  1. MVVM模式的基本组成部分
    • Model(模型)
      • 定义:Model代表应用程序的数据和业务逻辑。它可以是简单的JavaScript对象,也可以是与后端服务器进行交互的复杂数据层。例如,在一个用户管理应用中,Model可能包含用户对象,其属性有用户名、密码、电子邮件等。这些数据可以从数据库中获取,并且Model可能包含一些方法用于验证用户数据的合法性,如验证密码强度、检查电子邮件格式等。
      • 示例
        const userModel = {data: {username: 'John',password: '123456',email: 'john@example.com'},validatePassword() {// 简单的密码验证逻辑return this.data.password.length >= 6;},validateEmail() {// 简单的电子邮件验证逻辑const emailRegex = /^[a-zA - Z0 - 9_.+-]+@[a-zA - Z0 - 9 -]+\.[a-zA - Z0 - 9-.]+$/;return emailRegex.test(this.data.email);}
        };
        
    • View(视图)
      • 定义:View是用户界面的呈现部分,通常是由HTML、CSS和JavaScript(用于交互)构建的。它负责将数据展示给用户,并且接收用户的操作事件。在网页应用中,View就是用户在浏览器中看到的页面内容。例如,一个用户登录页面的View包括输入用户名和密码的表单元素,以及登录按钮等。
      • 示例
        <div id="login - view"><h1>Login</h1><form><input type="text" id="username - input" placeholder="Username"><input type="password" id="password - input" placeholder="Password"><button id="login - button">Login</button></form>
        </div>
        
    • ViewModel(视图模型)
      • 定义:ViewModel是连接Model和View的桥梁。它监听Model数据的变化,并将这些变化反映到View上;同时,它也监听View中的用户操作事件,并将这些事件转换为对Model的操作。ViewModel通常会暴露一些可观察的数据属性和方法,供View进行绑定和调用。在Vue.js中,Vue实例就充当了ViewModel的角色。
      • 示例:假设我们使用Vue.js来实现上述登录页面的ViewModel部分。
        new Vue({el: '#login - view',data: {username: '',password: ''},methods: {login() {// 这里可以调用Model的验证方法并进行登录操作const userModel = {data: {username: this.username,password: this.password},validatePassword() {// 简单的密码验证逻辑return this.data.password.length >= 6;},validateEmail() {// 简单的电子邮件验证逻辑const emailRegex = /^[a-zA - Z0 - 9_.+-]+@[a-zA - Z0 - 9 -]+\.[a-zA - Z0 - 9-.]+$/;return emailRegex.test(this.data.email);}};if (userModel.validatePassword()) {console.log('Login successful');} else {console.log('Invalid password');}}}
        });
        
  2. MVVM的工作流程原理
    • 数据绑定(从Model到View)
      • 单向数据绑定启动:当应用程序启动时,ViewModel会获取Model中的数据,并将其转换为可以被View理解和使用的格式。例如,在Vue.js中,通过data属性将Model中的数据暴露给View。在上述登录页面的例子中,usernamepassword数据属性在ViewModel(Vue实例)的data中定义,它们可以被View中的表单元素通过插值语法(如{{ username }})或者指令(如v - model)进行绑定。
      • 数据更新传播:当Model中的数据发生变化时,ViewModel会检测到这种变化。这可能是因为从服务器获取了新的数据,或者是应用程序内部的逻辑导致数据更新。ViewModel会将新的数据更新到View上。在Vue.js中,这种更新是自动的,通过其响应式系统实现。例如,如果Model中的用户信息因为用户编辑而更新,ViewModel会自动更新View中显示用户信息的部分,如更新用户名显示的p标签中的内容。
    • 事件绑定(从View到Model)
      • 事件监听建立:ViewModel会在View中设置事件监听器。在登录页面的例子中,ViewModel(Vue实例)通过v - on(缩写为@)指令监听login - buttonclick事件。当用户点击登录按钮时,对应的login方法在ViewModel中被调用。
      • 事件处理与Model更新:当View中的事件被触发后,ViewModel中的方法会执行相应的业务逻辑。这些业务逻辑可能会涉及到对Model数据的更新。例如,在登录方法login中,会获取View中用户输入的用户名和密码(通过this.usernamethis.password),并将其传递给Model进行验证。如果验证成功,可能会进一步更新Model中的用户登录状态等数据,同时也可能会触发后续的操作,如导航到用户主页等。
    • 双向数据绑定(结合数据绑定和事件绑定)
      • 指令实现双向绑定:在一些情况下,如表单元素的输入,需要实现双向数据绑定。在Vue.js中,v - model指令就实现了这种功能。以input元素为例,v - model在内部实际上是结合了数据绑定和事件绑定。它将input元素的value属性与ViewModel中的数据属性进行绑定(数据绑定),同时监听input元素的input事件(事件绑定)。
      • 工作机制说明:当用户在input元素中输入内容时,input事件被触发。v - model指令会获取新输入的值,并更新ViewModel中的数据属性。然后,由于数据绑定的存在,ViewModel会将更新后的数据传播到View中的其他部分,实现了数据的双向流动。例如,在一个实时搜索功能的应用中,用户在搜索框(input元素)中输入关键词,v - model会更新ViewModel中的搜索关键词数据,ViewModel可以根据这个新的数据向服务器发送搜索请求,同时更新View中显示搜索结果的部分。

发布-订阅,观察者模式

  1. 观察者模式(Observer Pattern)
    • 概念
      • 观察者模式是一种软件设计模式。在这种模式中有两个主要角色:被观察者(Subject)和观察者(Observer)。被观察者维护一个观察者列表,当被观察者的状态发生变化时,它会通知所有注册的观察者。观察者定义了一个更新接口,当接收到被观察者的通知时,会执行这个更新接口来做出响应。
    • 在Vue中的体现
      • 响应式数据:Vue的响应式数据系统可以看作是观察者模式的应用。以Vue实例中的data属性为例,每个被定义在data中的数据属性都是一个被观察者。当这些数据属性的值发生变化时,它们会通知与之关联的观察者,也就是使用这些数据属性的DOM元素(通过插值表达式、指令等方式关联)。
      • 实现细节:Vue使用Object.defineProperty(在ES5环境)或者Proxy(在ES6环境)来进行数据劫持。例如,当使用Object.defineProperty时,对于data中的每一个属性,会定义getset方法。get方法用于获取属性值,在这个过程中可以进行依赖收集,也就是记录哪些组件或者DOM元素(观察者)使用了这个属性。set方法用于设置属性值,当属性值被修改时,会触发set操作,此时会遍历之前收集的依赖(观察者)并通知它们进行更新。
      • 示例代码
        function defineReactive(obj, key, value) {let dep = new Dep();Object.defineProperty(obj, key, {get: function () {if (Dep.target) {dep.addSub(Dep.target);}return value;},set: function (newValue) {if (value === newValue) return;value = newValue;dep.notify();}});
        }
        
        这里Dep是一个依赖管理类,用于收集和通知观察者。defineReactive函数通过Object.defineProperty来实现数据的响应式。当属性被访问(get)时,收集依赖;当属性被修改(set)时,通知依赖进行更新。
  2. 发布 - 订阅模式(Publish - Subscribe Pattern)
    • 概念
      • 发布 - 订阅模式包含三个主要角色:发布者(Publisher)、订阅者(Subscriber)和消息中心(Broker)。发布者将消息发送到消息中心,而不是直接发送给订阅者。订阅者向消息中心订阅感兴趣的消息类型。当消息中心收到发布者发送的消息后,会将消息转发给所有订阅了该消息类型的订阅者。
    • 与观察者模式的区别
      • 在观察者模式中,被观察者和观察者是紧耦合的,被观察者需要直接维护观察者列表并通知它们。而在发布 - 订阅模式中,发布者和订阅者是通过消息中心解耦的,发布者不需要知道订阅者的存在,订阅者也不需要知道发布者的存在,它们只和消息中心交互。
    • 在Vue中的体现
      • 事件系统:Vue的事件系统可以看作是发布 - 订阅模式的一种应用。$on方法用于订阅事件,$emit方法用于发布事件。例如,在一个组件中,当一个按钮被点击时,可以通过$emit发布一个自定义事件,而其他组件可以通过$on订阅这个事件来做出响应。
      • 示例代码
        • 发布事件(在子组件中)
          export default {methods: {handleClick() {this.$emit('custom - event', 'Hello, World!');}}
          };
          
        • 订阅事件(在父组件中)
          new Vue({el: '#app',methods: {handleCustomEvent(message) {console.log(message);}},mounted() {this.$on('custom - event', this.handleCustomEvent);}
          });
          
        • 这里子组件通过$emit发布了一个名为custom - event的事件,并传递了一个消息。父组件通过$on订阅了这个事件,当事件被发布时,父组件的handleCustomEvent方法会被调用,从而实现了发布 - 订阅模式下消息的传递和响应。

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

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

相关文章

【服务器项目部署】✈️将本地项目部署到服务器(二)!

目录 &#x1f44b;前言 &#x1f440;一、功能调整 &#x1f331;二、服务部署 &#x1f49e;️三、代码调整 &#x1f37b;四、章末 &#x1f44b;前言 小伙伴们大家好&#xff0c;上篇文章本地实践了如何将本地项目部署到服务器上&#xff0c;从服务器的选择、服务器环境…

Kafka消息队列

目录 前置内容常用脚本说明和示例描述与定义部分术语说明两种模式点对点模式发布订阅模式 topic主题命令行操作指令生产者Broker消费者 前置内容 队列&#xff1a; 先进先出 应用&#xff1a; 大数据中主要用于离线和实时处理 流程&#xff1a; Flume正常获取数据&#xff0c;…

如何使用 Ansys OptiSlang 同时运行多个参数化设计研究

了解如何通过使用 OptiSLang 同时运行多个参数化设计研究来提高工作效率。 了解参数化设计研究的重要性 参数化设计研究在工程和设计过程中起着至关重要的作用。通过改变输入参数&#xff0c;工程师可以探索不同设计选择的效果&#xff0c;并优化其设计以满足性能、成本或其他…

Nginx (40分钟学会,快速入门)

一、什么是Nginx ? 可以做什么 &#xff1f; Nginx 是高性能的 HTTP 和反向代理的 web 服务器&#xff0c;处理高并发能力是十分强大的&#xff0c;能经受高负载的考验&#xff0c;有报告表明能支持高达50000个并发的连接数.Nginx特点就是内存少&#xff0c;并发能力强。事实上…

【Rust自学】10.6. 生命周期 Pt.2:生命周期的语法与例子

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 10.6.1. 生命周期标注语法 生命周期的标注并不会改变引用的生命周期长度。如果某个函数它制定了泛型生命周期参数&#xff0c;那么它就可…

【Android项目学习】3. MVVMHabit

项目链接 文章目录 一. 项目结构1. 项目整体划分2. 模块细分 二. Android知识点学习1. registerActivityLifecycleCallbacks方法2. 一. 项目结构 1. 项目整体划分 MVVMHabit是以谷歌DataBindingLiveDataViewModel框架为基础&#xff0c;整合OkhttpRxJavaRetrofitGlide等流行…

【大模型】7 天 AI 大模型学习

7 天 AI 大模型学习 Day 3 今天&#xff0c;我们要一起学习大模型微调了 &#xff5e; 包括&#xff1a;大模型微调领域概览、Lora微调 等 &#xff5e; 文章目录 7 天 AI 大模型学习 Day 3大模型微调概览大模型项目 pipeline提示词工程 Prompt EngineeringIn-context Learning…

密码学精简版

密码学是数学上的一个分支&#xff0c;同时也是计算机安全方向上很重要的基础原理&#xff0c;设置密码的目的是保证信息的机密性、完整性和不可抵赖性&#xff0c;安全方向上另外的功能——可用性则无法保证&#xff0c;可用性有两种方案保证&#xff0c;冗余和备份&#xff0…

DeepSeek-V3 正式发布,已在网页端和 API 全面上线,性能领先,速度飞跃。

DeepSeek-V3 在推理速度上相较历史模型有了大幅提升。在目前大模型主流榜单中&#xff0c;DeepSeek-V3 在开源模型中位列榜首&#xff0c;与世界上最先进的闭源模型不分伯仲。 简介 DeepSeek-V3是一个强大的混合专家 (MoE) 语言模型&#xff0c;总共有 671B 个参数&#xff0c;…

图像超分辨新SOTA!南洋理工提出InvSR,利用大型预训练扩散模型图像先验来提高 SR 性能, 登上Huggingface热门项目。

南洋理工大学的研究者们提出了一种基于扩散反演的新型图像超分辨率 (SR) 技术&#xff0c;可以利用大型预训练扩散模型中蕴含的丰富图像先验来提高 SR 性能。 该方法的核心是一个深度噪声预测器&#xff0c;用于估计前向扩散过程的最佳噪声图。一旦训练完成&#xff0c;这个噪…

MySQL低版本没有函数row_number() over的解决方案

最近在维护老项目时&#xff0c;需要对历史数据做分析取出分区数据中的第一条&#xff0c;无奈因为MySQL版本过低&#xff0c;无法使用函数row_number() over&#xff0c;苍了个天~ 不过这点小事怎么可能难倒我们这群考古专家呢&#xff0c;在此分享一下解决方案。 主要原因是问…

贵州省贵安新区地图+全域数据arcgis格式shp数据矢量路网地名+卫星影像底图下载后内容测评

贵州省贵安新区地图全域数据arcgis格式shp数据矢量路网地名卫星影像底图 贵安新区地图是一款基于ArcGIS格式的地理信息系统数据集&#xff0c;包含2022年3月更新的详尽矢量路网、地名信息以及卫星影像底图。这款数据集是针对贵安新区这一特定区域设计的&#xff0c;对于规划、…

npm install --global windows-build-tools --save 失败

注意以下点 为啥下载windows-build-tools&#xff0c;是因为node-sass4.14.1 一直下载不成功&#xff0c;提示python2 没有安装&#xff0c;最终要安装这个&#xff0c;但是安装这个又失败&#xff0c;主要有以下几个要注意的 1、node 版本 14.21.3 不能太高 2、管理员运行 …

音视频入门基础:MPEG2-PS专题(5)——FFmpeg源码中,解析PS流中的PES流的实现

一、引言 从《音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;3&#xff09;——MPEG2-PS格式简介》中可以知道&#xff0c;PS流由一个个pack&#xff08;包装&#xff09;组成。一个pack 一个pack_header 一个或多个PES_packet。pack_header中还可能存在system header…

记一次k8s下容器启动失败,容器无日志问题排查

问题 背景 本地开发时&#xff0c;某应用增加logback-spring.xml配置文件&#xff0c;加入必要的依赖&#xff1a; <dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>8…

【问题记录】npm create vue@latest报错

1&#xff0c;错误日志 npm error code EPERM npm error syscall mkdir npm error path D:\Program Files\nodejs\node_cache\_cacache npm error errno EPERM npm error FetchError: Invalid response body while trying to fetch https://registry.npmjs.org/create-vue: EP…

JavaWeb开发(六)XML介绍

1. XML介绍 1.1. 什么是XML &#xff08;1&#xff09;XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种很像HTML的标记语言。   &#xff08;2&#xff09;XML 的设计宗旨是传输数据(目前主要是作为配置文件)&#xff0c;而不是显示数据。   &#xff08;3&a…

Vue3实现PDF在线预览功能

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:Vue3现PDF在线预览功能 前言 在开发中&#xff0c;PDF预览和交互功能是一个常见的需求。无论是管理…

win32汇编环境,在窗口程序中画简单图形

;运行效果 ;win32汇编环境&#xff0c;在窗口程序中画简单图形 ;展示点、直线、圆、椭圆、正方形、矩形、圆角矩形的画法 ;将代码复制进radasm软件里&#xff0c;直接编译可运行.重要部分加备注。 ;>>>>>>>>>>>>>>>>>>&…

[7种方法] 如何修复iPad无法连接到App Store

“现在已经 3 天了&#xff0c;我无法从 iPad 连接到 App Store。起初&#xff0c;我以为这是服务器问题&#xff0c;但已经过去 3 天了&#xff0c;问题仍然存在。请帮助我&#xff01;” 如果您的iPad 无法连接到 App Store&#xff0c;可能有多种原因。即使是日期和时间设置…