前端设计模式 MVVM和MVC,vue的数据双向绑定原理

MVVM和MVC

是两种前端设计模式,用于组织和管理前端代码,实现代码的可维护性和可扩展性。

MVC模式(Model-View-Controller)是一种将应用程序分为三个核心部件的模式。模型(Model)负责存储应用程序的数据和业务逻辑;视图(View)负责显示用户界面;控制器(Controller)负责处理用户输入并更新模型和视图。MVC模式的目标是将应用程序的不同部分分开,以便更好地组织和管理代码。

MVVM模式(Model-View-ViewModel)是一种由微软提出的前端设计模式,类似于MVC模式。在MVVM模式中,视图(View)和模型(Model)之间的联系是通过视图模型(ViewModel)来实现的。视图模型是一个中介者,负责在视图和模型之间进行通信和数据绑定。当视图模型中的数据发生变化时,它会通知视图进行更新,从而实现双向数据绑定。

举个例子来说,假设我们有一个简单的Todo List应用程序。在MVC模式中,我们可以将模型定义为包含Todo列表数据和处理业务逻辑的JavaScript对象。我们可以将视图定义为HTML模板,通过模板来显示Todo列表。控制器则负责处理用户输入,例如添加和删除Todo项,并将这些更改反映到模型和视图中。

在MVVM模式中,我们可以将视图定义为HTML模板,但是我们需要添加一个视图模型来实现数据绑定。视图模型包含所有Todo列表数据,并定义了用于处理用户输入的方法。当用户添加或删除Todo项时,视图模型会自动更新Todo列表,并将更改反映到视图中。

从根本上说,MVC是基于控制器的设计模式,而MVVM是基于数据绑定的设计模式。在MVC中,Controller负责处理用户输入,并将其传递给Model或View进行处理。在MVVM中,ViewModel通过数据绑定将View和Model之间的通信自动化,消除了Controller的需要。总的来说,MVC和MVVM都是非常有用的前端设计模式,可以帮助我们更好地组织和管理前端代码。在实际开发中,我们可以根据具体的应用场景选择合适的模式来使用。

vue的双向数据绑定

在 Vue 的 MVVM 模式中,View 层负责渲染数据和交互事件,Model 层负责存储数据和与后端交互,ViewModel 层则是负责监听 Model 的数据变化,通过双向数据绑定将数据变化自动同步到 View 上,同时也通过事件监听,将 View 上的用户操作同步到 Model 上。这种架构模式的好处在于可以有效地将业务逻辑和视图分离,提高代码可维护性和可扩展性。在Vue中,通常将数据模型层、视图模型层和视图层分为以下三个实例:

  • Model层实例:代表应用程序的数据层,通常使用JavaScript对象表示。在Vue中,数据模型可以通过Vue实例的data选项来声明。这些数据模型实例可以在ViewModel层中使用,实现双向数据绑定。
  • ViewModel层实例:在Vue中,Vue实例扮演了ViewModel层的角色,它是连接Model层和View层的桥梁。它的主要任务是将Model层中的数据绑定到View层上,并且将View层中的事件反向绑定到Model层上。ViewModel层还可以包含计算属性、方法、侦听器和自定义事件等逻辑。
  • View层实例:代表了用户看到的页面元素,通常使用HTML和CSS表示。在Vue中,视图层可以使用Vue实例的模板和渲染函数来声明。这些视图实例通常会响应ViewModel层中的数据变化,并在用户与之交互时触发相关事件。

总之,Vue的MVVM架构中,Model层负责数据的存储和处理,ViewModel层负责逻辑的处理和控制数据的流向,View层负责页面元素的展示和与用户的交互。在Vue中,Vue实例扮演了ViewModel层的角色,将Model层和View层联系起来,实现数据的双向绑定。

Vue 的双向数据绑定是通过数据劫持实现的。在 Vue 中,每个组件实例都有一个对应的 Watcher 实例,当数据发生变化时,这个 Watcher 实例会通过 update 方法通知组件实例更新视图。在 Vue 的实现中,通过 Object.defineProperty 方法对数据进行劫持,为每个属性定义 getter 和 setter,当属性被读取或修改时,触发相应的 getter 和 setter,从而在读取或修改属性的过程中实现了双向数据绑定。

具体来说,当一个组件实例被创建时,Vue 会对其所有的 data 属性进行数据劫持,为每个属性创建对应的 Dep 实例,同时为该属性定义 getter 和 setter。getter 方法会将该属性的 Dep 实例添加到当前 Watcher 实例的订阅列表中,setter 方法则会在属性发生变化时,通知订阅该属性的所有 Watcher 实例执行 update 方法更新视图。

在Vue.js中,双向数据绑定的流程如下:

  1. 初始化阶段,Vue会遍历ViewModel中的属性,创建组件实例,对 data 属性进行数据劫持,通过Object.defineProperty方法将其转化为getter和setter方法。同时,Vue还会为每个属性创建一个依赖列表Dep实例,用来存放所有依赖该属性的Watcher对象。
  2. 渲染阶段,Vue会将模板编译成渲染函数,并在渲染器中执行该函数。在执行过程中,渲染器会创建一个Watcher对象,并将其添加到依赖列表中,将 Watcher 实例与组件实例建立关联。当ViewModel中的属性被访问时,在getter方法中,将Watcher添加到依赖列表中。在这个过程中,如果ViewModel中的属性发生变化,触发对应属性的 setter 方法;setter 方法通知订阅该属性的所有 Watcher 实例执行 update 方法;Watcher 实例执行 update 方法,更新视图。Watcher会自动触发回调函数,从而更新视图。
  3. 用户交互阶段,当用户修改了View中的某个元素时,该元素会触发change或者input事件。在事件处理函数中,Vue会自动更新ViewModel中对应的属性。在更新过程中,如果ViewModel中的属性发生变化,Watcher会自动触发回调函数,从而更新视图。

这种基于数据劫持的双向数据绑定方案,使得开发者可以专注于业务逻辑的实现,而不用过多考虑视图的更新细节,从而提高了代码的可维护性和可读性。
前端设计模式 MVVM和MVC,vue的数据双向绑定原理_第1张图片
在这里插入图片描述在 Vue 中,操作 DOM 节点的工作通常是由指令和组件来完成的,而不是直接操作 DOM 节点。Vue 框架通过双向数据绑定实现了模型(Model)和视图(View)的分离,视图的更新由 Vue 自动完成,开发者不需要手动操作 DOM。

在 Vue 的实现中,Vue 的核心是一个响应式系统(Reactivity System),它能够追踪数据的变化,并在数据发生变化时自动更新视图。当数据发生变化时,Vue 会重新计算虚拟 DOM,并比较新旧虚拟 DOM 的差异,最后只对需要更新的部分进行 DOM 操作。

因此,可以说 Vue 并不是完全不操作 DOM 节点,而是通过虚拟 DOM 的机制,尽可能地减少了对 DOM 的直接操作,从而提高了性能和可维护性。

你可能感兴趣的:(前端,前端,设计模式,mvc,vue)