您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

浅谈Vue2中MVVM的实现

时间:2023-11-20 15:03:08  来源:微信公众号  作者:移动Labs

Labs 导读

Vue.js是一款适用于构建用户界面的渐进式JAVAScript框架。它由尤雨溪在2014年推出,并迅速成为最流行的前端框架之一。Vue.js的设计目标是通过简单、灵活的API,提供一种高效、可复用和响应式的方式来构建现代化的Web应用程序。自Vue发行以来,就受到了国内外爆发式的关注,如今已经成为了最流行的前端框架之一,并且其已经具有了庞大的生态系统。Vue框架采用了MVVM的设计模式,本文简单介绍Vue2中MVVM的实现。

 

Vue.js作为一款流行的前端框架,其整体框架的设计采用了前端框架中常用的MVVM设计模式,将视图与数据相互解耦,分离了关注点并支持双向数据绑定,使得页面的变化呈响应式,能够根据数据的变化而自动更新视图。而Vue对MVVM模型的实现离不开数据的双向绑定以及虚拟DOM的页面渲染机制。本文接下来将从Vue的MVVM模型、数据双向绑定的实现以及虚拟DOM机制分别展开介绍。

Part 01、  MVVM模型  

MVVM即Model-View-ViewModel,是前端三大MV*(MVC、MVP、MVVM)模型之一,是 MVC 模型的改进版本。MVVM模型通过数据双向绑定的方式来解耦视图和模型,有助于从概念层面上将图形用户界面的开发与业务逻辑或后端逻辑的开发分离开来,从而使视图不依赖于任何特定的模型平台,其优势在于明确地分离了界面和业务逻辑,使代码更易于维护、重用和测试。MVVM指代了三个部分,具体如下:

1.Model(模型):模型代表着应用程序中的数据和业务逻辑。在Vue.js中,模型可以是应用程序的数据对象、服务端API返回的数据,或者其他需要进行处理和展示的数据。

2.View(视图):视图是用户界面的可见部分,即用户所看到和与之交互的界面元素。在Vue.js中,视图由模板(Template)来定义,模板是一种声明式的html扩展语法,在模板中可以使用Vue的指令、插值表达式等来动态渲染数据。

3.ViewModel(视图模型):视图模型是连接视图和模型的桥梁,负责处理视图和模型之间的数据交互和逻辑控制。在Vue.js中,视图模型由Vue实例来表示,它是一个JavaScript对象,包含了模板中所需的数据、方法和计算属性等。

浅谈Vue2中MVVM的实现

在Vue中,上图Controller的功能便是通过数据的双向绑定来实现的,而数据引发视图的更新则是通过虚拟DOM来实现的。在运用MVVM设计模式的情况下,Vue的工作原理如下:

  • 当用户与视图进行交互(例如点击按钮、输入表单等),视图触发相应的事件。
  • 视图模型监听这些事件,并根据业务逻辑更新模型的数据。
  • 当数据发生变化时,模型发送通知给视图模型,视图模型根据变化更新视图。
  • 视图根据最新的数据重新渲染,展示给用户。

上述过程主要为数据更新时的执行逻辑,这个过程在Vue整个生命周期中属于更新阶段。而Vue 的生命周期实际上就是 Vue 组件从创建到销毁的整个过程,被分为了四个阶段,八个钩子函数(可以理解为事件回调函数)。分别为创建阶段、挂载阶段、更新阶段、销毁阶段,MVVM中视图与模型的初始化和数据双向绑定则在创建阶段的beforeCreate以及挂在阶段的mounted中实现。

Part 02、  数据双向绑定的实现  

Vue数据双向绑定的实现实质上也就是MVVM中Controller的实现。Vue的数据双向绑定是通过数据劫持结合发布/订阅者的模式实现的,而数据劫持在Vue底层是通过Object.defineProperty()方法实现的。Object.defineProperty()方法是原生JS提供的一个定义对象属性的接口,通过该方法的get和set配置项可以实现在一个对象中代理另一个对象的属性变化,即getter和setter,这使得我们在访问或修改对象的属性时可以执行自定义的逻辑。

在Vue中,当我们定义一个响应式数据时,Vue会将该数据转化为一个称为“响应式代理对象”的对象(data配置项中的属性)。在这个代理对象中,Vue就会使用Object.defineProperty()方法为对象中所有属性定义一个getter和setter。从而当我们访问响应式代理对象的属性时,Vue的getter会被触发,从而执行一些与数据相关的逻辑,例如依赖追踪和通知订阅者。而当我们修改响应式代理对象的属性时,Vue的setter会被触发,它会接收新的值并执行一些对应的更新操作,例如触发视图重新渲染。这种方式称为“劫持”或“拦截”对象的访问和修改操作,以实现数据的响应式。

在Vue劫持了所有需要监听的所有属性后,结合Vue的消息发布-订阅模式,每当数据变化就会通过消息发布-订阅模式的方式监测到数据的变化,并重新编译视图以此实现响应式。Vue中数据双向绑定机制如图所示,其中Dep 是订阅收集器。

浅谈Vue2中MVVM的实现

其中,Vue的数据监测也是通过数据劫持的方式实现的,但Vue只会对对象进行数据劫持为其生成setter和getter,而对于数组Vue并不会对其进行数据劫持。对于数组Vue的处理方式是监测数组数据调用的方法,当调用了能够改变原数组的方法时,Vue会将该方法进行二次封装。原本这些方法只做了他们原本该做的事情,但Vue包装过之后,还加了一件事进去,即重新解析页面生成虚拟DOM并执行diff算法生成新的DOM结构,交给浏览器进行页面的更新渲染,以此实现对数组数据改变的响应。但是值得注意的是,那些不会引起原数组改变的方法以及通过数组索引直接进行修改而没有调用任何方法的情况,Vue并不会监测到,因此也不会出现响应式的效果。

Part 03、 虚拟DOM机制 

Vue的虚拟DOM是一种在内存中维护的轻量级DOM树,在页面初始渲染时生成,虚拟DOM机制的原理如下:

1)生成虚拟DOM:当Vue组件首次渲染时,会生成一个虚拟DOM树,称为初始虚拟 DOM。这棵树的结构与实际的DOM结构相似,但是只是在内存中存在,并没有直接渲染到页面上。

2)更新虚拟DOM:当组件的状态发生变化时,Vue 会生成一个新的虚拟DOM树,称为更新虚拟DOM。该树与初始虚拟DOM相比,只有发生变化的部分会被重新创建,其余部分则会被复用。

3)对比并计算差异:Vue会对比初始虚拟DOM和更新虚拟DOM,找出两棵树之间的差异。这个过程称为虚拟DOM的diff算法。通过这个算法,Vue可以高效地找出需要进行修改、添加或移除的节点。

4)批量更新真实DOM:根据差异的计算结果,Vue会将需要进行修改的部分同步到实际的DOM中。由于虚拟DOM是在内存中操作的,因此可以通过批量更新的方式,将多个DOM修改操作合并为一个,从而减少实际的DOM操作,提高性能。

浅谈Vue2中MVVM的实现

在常规的直接操作实际DOM的方式下,页面数据的每次改变都会引发浏览器重新计算和渲染整个DOM树。这种操作会涉及到大量的DOM访问和修改,而这些操作通常是相对较慢的,尤其在涉及复杂的页面结构和大量的DOM元素时。在数据发生改变需要重新解析页面结构的时候,Vue并不是直接将解析的页面结构直接交给浏览器渲染,而是先根据虚拟DOM采用Diff算法计算出DOM中更新的部分,然后只交给浏览器更新的部分去渲染,从而减少浏览器对DOM的操作和页面的重排重构,提高浏览器解析页面的性能。所以本质上来说,虚拟DOM是利用了JS代码的运行速度来减负了浏览器更新DOM的消耗。

Part 04、  总结 

在Vue中,MVVM的实现主要是通过数据双向绑定以及虚拟DOM实现的,在Vue中的具体实现则是通过Vue实例来完成的。在Vue实例的生命周期中,在创建阶段生成Vue实例完成ViewModel的初始化;在挂载阶段使用Object.defineProperty()方法来劫持和观察数据对象的属性访问和修改,完成数据与视图的数据双向绑定;在更新阶段应用虚拟DOM+Diff算法来高效地确定需要进行修改、添加或删除的节点并将更新的节点交给浏览器渲染,而不是直接操作实际的DOM,提高了渲染效率。需要注意的是,在Vue中,虚拟DOM主要用于优化渲染性能,而非作为实现MVVM的核心机制。数据的双向绑定才是MVVM模型的主要实现方式,虚拟DOM则是为了提高性能而引入的辅助手段。这样,通过Vue实例作为ViewModel,开发者能够更方便地管理和操作应用的界面和数据,实现了视图和数据模型之间的双向绑定,使代码更具可读性和可维护性。



Tags:Vue   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
浅谈Vue2中MVVM的实现
Labs 导读Vue.js是一款适用于构建用户界面的渐进式JavaScript框架。它由尤雨溪在2014年推出,并迅速成为最流行的前端框架之一。Vue.js的设计目标是通过简单、灵活的API,提供一...【详细内容】
2023-11-20  Tags: Vue  点击:(0)  评论:(0)  加入收藏
Spring Boot + Vue3 前后端分离 实战wiki知识库系统
下栽の地止:https://www.itwangzi.cn/2508.html Spring Boot + Vue3 前后端分离 实战wiki知识库系统在当今的Web应用开发中,前后端分离已经成为了一种主流的开发模式。Spring...【详细内容】
2023-11-18  Tags: Vue  点击:(1)  评论:(0)  加入收藏
即将到来的 Vue 3 “Vapor Mode”
今年年初,尤雨溪在 2023 新年展望中提到了 Vue 3 “Vapor Mode”:Vapor Mode 是一直在试验的另一种编译策略,其灵感来自于 Solid。给定相同的 Vue SFC,与当前基于虚拟 DOM 的输...【详细内容】
2023-11-10  Tags: Vue  点击:(8)  评论:(0)  加入收藏
2024年了,别只使用React,需要学习一下Vue,不然没出路了
最近,我的朋友因为不熟悉 Vue.js 而未能通过面试。她平时工作中大部分时间都在使用React,所以也懒得去了解其他前端框架。世界上所有的前端框架我们都应该熟悉吗?不,这是极其不...【详细内容】
2023-11-08  Tags: Vue  点击:(17)  评论:(0)  加入收藏
深入详解Vue3中的Mock数据模拟
Vue3 前端开发时,需要api请求模拟和数据模拟,我将在接下来的时间写Mock模拟和json-server模拟。两种比较流行的模式,现在先介绍mock模式。使用NPM安装Mock.js库Mock.js是一个轻...【详细内容】
2023-11-07  Tags: Vue  点击:(9)  评论:(0)  加入收藏
Vue 样式的七个你不知道的技巧
单文件组件由三个不同的实体组成:模板、脚本和样式。所有这些都很重要,但后者往往被忽视,尽管它可能会变得复杂,并经常导致挫折和错误。更好地理解可以改进代码审查并减少调试时...【详细内容】
2023-11-06  Tags: Vue  点击:(15)  评论:(0)  加入收藏
Vue3 中使用 Vue Router 4.X
vue3 中 使用 router项目初始化见 [如何创建你的第一个 Vue3 应用脚手架]< https://www.toutiao.com/article/7296870015364874787/>Vue Router 官网 https://router.vuejs....【详细内容】
2023-11-05  Tags: Vue  点击:(6)  评论:(0)  加入收藏
如何创建你的第一个 Vue3 应用脚手架
前提条件: 已安装 16.0 或更高版本的 Node.js。 确保你安装了最新版本的 Node.js,并且你的当前工作目录正是打算创建项目的目录。在命令行中运行以下命令 (不要带上 > 符号),...【详细内容】
2023-11-02  Tags: Vue  点击:(8)  评论:(0)  加入收藏
一个基于Vue模型的表单生成器
EndVuetify Form Base是一个基于模型的表单生成器,目的是提供一个工具,以便以较少的努力从任何模型数据生成可编辑的表单,即使模型是一个深度嵌套的对象。Vuetify Form Base作...【详细内容】
2023-10-31  Tags: Vue  点击:(21)  评论:(0)  加入收藏
使用VUE的公司越来越多,VUE究竟有何好处?
前端框架一般指用于简化网页设计的框架,使用广泛的前端开发套件,比如,jquery,extjs,bootstrap等等,这些框架封装了一些功能,比如html文档操作,漂亮的各种控件(按钮,表单等等),使用前端框...【详细内容】
2023-10-31  Tags: Vue  点击:(18)  评论:(0)  加入收藏
▌简易百科推荐
浅谈Vue2中MVVM的实现
Labs 导读Vue.js是一款适用于构建用户界面的渐进式JavaScript框架。它由尤雨溪在2014年推出,并迅速成为最流行的前端框架之一。Vue.js的设计目标是通过简单、灵活的API,提供一...【详细内容】
2023-11-20  移动Labs  微信公众号  Tags:Vue   点击:(0)  评论:(0)  加入收藏
快速创建高效REST API的十个要点解析
1 使用描述性和有意义的资源名称选择准确表示所代表实体的资源名称,不使用泛泛或模糊的名称。2 正确使用 HTTP 方法针对不同的操作使用适当的 HTTP 方法(GET、POST、PUT、DELE...【详细内容】
2023-11-20  Java学研大本营  微信公众号  Tags:REST   点击:(2)  评论:(0)  加入收藏
Kotlin的作用域函数有哪些?
Kotlin作用域函数Kotlin提供了几个作用域函数,用于在特定的作用域内执行代码块。这些作用域函数包括: let函数:let函数允许您在对象上执行代码块,并将对象作为参数传递给代码...【详细内容】
2023-11-20  沐雨花飞蝶  微信公众号  Tags:Kotlin   点击:(2)  评论:(0)  加入收藏
深度学习之模型压缩、加速模型推理
简介当将一个机器学习模型部署到生产环境中时,通常需要满足一些在模型原型阶段没有考虑到的要求。例如,在生产中使用的模型将不得不处理来自不同用户的大量请求。因此,您将希望...【详细内容】
2023-11-20  小白玩转Python  微信公众号  Tags:深度学习   点击:(3)  评论:(0)  加入收藏
聊聊接口最大并发处理数
今天跟大家聊聊一个 Java 界的老话题,就是怎么理解接口的最大并发处理数。前言生活在 2023 年的互联网时代下,又是在国内互联网越发内卷的背景下,相信大家面试找工作、网上学习...【详细内容】
2023-11-20  waynblog  微信公众号  Tags:接口   点击:(2)  评论:(0)  加入收藏
通过实例理解Web应用跨域问题
在开发Web应用的过程中,我们经常会遇到所谓“跨域问题(Cross Origin Problem)”。跨域问题是由于浏览器的同源策略(Same-origin policy)[1]导致的,它限制了不同源(Origin:域名...【详细内容】
2023-11-20  TonyBai  微信公众号  Tags:Web应用   点击:(2)  评论:(0)  加入收藏
深入理解CPU缓存一致性协议MESI
今天,我们就深入聊聊关于CPU缓存一致性协议MESI的有关知识,希望能够为小伙伴们带来实质性的帮助。好了,不多说了,进入今天的正题。CPU高速缓存CPU为何要有高速缓存CPU在摩尔定律...【详细内容】
2023-11-20  冰河技术  微信公众号  Tags:CPU缓存   点击:(2)  评论:(0)  加入收藏
解密 SSE,像 ChatGPT 一样返回流式响应
我们知道目前的 HTTP/1.1 采用的是标准的请求-响应模型,客户端主动发请求,服务端被动地返回响应。这种模型在客户端需要实时获取结果的场景下是不合适的,因为这意味着客户端需...【详细内容】
2023-11-20  古明地觉的编程教室  微信公众号  Tags:ChatGPT   点击:(3)  评论:(0)  加入收藏
RabbitMQ插件开发指南:定制化你的消息队列
RabbitMQ是一个功能强大的消息队列系统,它提供了灵活的插件机制,使用户能够定制化自己的消息队列。下面将为您介绍RabbitMQ插件开发的指南,让您能够根据自己的需求编写定制化的...【详细内容】
2023-11-20  编程技术汇  今日头条  Tags:RabbitMQ   点击:(4)  评论:(0)  加入收藏
读懂这一篇,集群节点不下线
问题一直在发生1. I&#39;m NotReady阿里云有自己的 Kubernetes 容器集群产品。随着 Kubernetes 集群出货量的剧增,线上用户零星的发现,集群会非常低概率地出现节点 NotReady...【详细内容】
2023-11-20    云原生运维圈  Tags:集群   点击:(2)  评论:(0)  加入收藏
站内最新
站内热门
站内头条