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

浅谈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   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
前端开始“锈化”?Vue团队开源JS打包工具:基于Rust、速度极快、尤雨溪主导
Vue 团队已正式开源Rolldown —— 基于 Rust 的 JavaScrip 打包工具。Rolldown 是使用 Rust 开发的 Rollup 替代品,它提供与 Rollup 兼容的应用程序接口和插件接口...【详细内容】
2024-03-09  Search: Vue  点击:(11)  评论:(0)  加入收藏
SpringBoot3+Vue3 开发高并发秒杀抢购系统
开发高并发秒杀抢购系统:使用SpringBoot3+Vue3的实践之旅随着互联网技术的发展,电商行业对秒杀抢购系统的需求越来越高。为了满足这种高并发、高流量的场景,我们决定使用Spring...【详细内容】
2024-01-14  Search: Vue  点击:(90)  评论:(0)  加入收藏
React与Vue性能对比:两大前端框架的性能
React和Vue是当今最流行的两个前端框架,它们在性能方面都有着出色的表现。React的加载速度:初次加载:由于React使用了虚拟DOM(Virtual DOM)技术,它可以通过比较虚拟DOM树与实际DOM...【详细内容】
2024-01-05  Search: Vue  点击:(106)  评论:(0)  加入收藏
Vue中Scope是怎么做样式隔离的?
scope样式隔离在 Vue 中,样式隔离是通过 scoped 特性实现的。当在一个组件的 <style> 标签上添加 scoped 特性时,Vue 会自动为这个样式块中的所有选择器添加一个唯一的属性,以...【详细内容】
2024-01-04  Search: Vue  点击:(80)  评论:(0)  加入收藏
vue3中 ref和 reactive的区别 ?
最近有朋友在面试过程中经常被问到这么一个问题,vue3 中的ref 和 reactive的区别在哪里,为什么 要定义两个API 一个 api不能实现 响应式更新吗??带着这个疑问 ,我们 接下来进行逐...【详细内容】
2024-01-03  Search: Vue  点击:(36)  评论:(0)  加入收藏
React18 与 Vue3 全方面对比
1. 编程风格 & 视图风格1.1 编程风格 React 语法少、难度大;Vue 语法多,难度小例如指令:Vue<input v-model="username"/><ul> <li v-for="(item,index) in list" :key="inde...【详细内容】
2024-01-03  Search: Vue  点击:(72)  评论:(0)  加入收藏
Vue中虚拟Dom技术,你学会了吗?
在Vue中,虚拟DOM(Virtual DOM)是一项关键的技术,它是一种用JavaScript对象模拟真实DOM结构的机制。虚拟DOM的引入旨在提高DOM操作的效率,特别是在频繁的数据变化时。1. 为什么需...【详细内容】
2023-12-26  Search: Vue  点击:(65)  评论:(0)  加入收藏
七个常用的 Vue 3 UI 组件
介绍:由于我在工作的公司中角色和职责的变化,作为后端开发人员的我在去年年底选择了 Vue.js。当我深入研究时,我发现 Vue.js 非常有趣。它不像 Angular 那样有很高的学习曲线,而...【详细内容】
2023-12-20  Search: Vue  点击:(78)  评论:(0)  加入收藏
Vue3 学习笔记,如何使用 Watch 监听数据变化
大家好,本篇文章我们继续学习和 Vue 相关的内容,今天我们归纳总结下如何使用 watch 监听组件中的数据变化,以及 computed 和 watch 的区别。什么是 watch,以及如何使用?watch 是...【详细内容】
2023-12-14  Search: Vue  点击:(163)  评论:(0)  加入收藏
Vue3 学习笔记,如何理解 Computed 计算属性
大家好,本篇文章我们继续学习和 Vue 相关的内容,今天我们归纳总结下什么是 computed 计算属性、如何使用和应用场景,以及 computed 和 Method 事件的区别和应用场景。什么是 co...【详细内容】
2023-12-11  Search: Vue  点击:(199)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(5)  评论:(0)  加入收藏
站内最新
站内热门
站内头条