v-model与 mvvm 回顾
文章目录
v-model 与 mvvm mvvm剖析 发布-订阅,观察者模式
v-model 与 mvvm
概念理解
v-model
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
}
} ) ;
区别
层次不同
v-model
是Vue框架中的一个具体指令,它主要关注的是在视图(View)层的表单元素和数据之间建立便捷的双向绑定关系。它是MVVM模式在Vue中实现数据双向绑定的一种具体手段。MVVM是一种架构模式,它涉及到模型(Model)、视图(View)和视图模型(ViewModel)三个层次之间的关系和交互。它是一种更宏观的设计理念,用于组织和管理整个应用程序的结构,使得数据和视图能够有效地分离并且方便地进行交互。 功能范围不同
v-model
主要用于表单元素的双向数据绑定,功能比较聚焦。例如,它可以很方便地处理用户在input
、textarea
、select
等表单元素中的输入和数据更新。MVVM涵盖的范围更广,它不仅包括数据绑定(像v - model
所做的),还包括数据的获取、处理、存储(Model层),视图的渲染和事件处理(View层),以及中间的协调逻辑(ViewModel层)。例如,在一个复杂的应用中,ViewModel可能会从服务器获取数据(涉及Model),然后将数据处理成适合视图展示的格式,并且处理视图中的各种交互事件。 应用场景
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剖析
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(视图)
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 ( ) {
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' ) ;
}
}
}
} ) ;
MVVM的工作流程原理
数据绑定(从Model到View)
单向数据绑定启动 :当应用程序启动时,ViewModel会获取Model中的数据,并将其转换为可以被View理解和使用的格式。例如,在Vue.js中,通过data
属性将Model中的数据暴露给View。在上述登录页面的例子中,username
和password
数据属性在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 - button
的click
事件。当用户点击登录按钮时,对应的login
方法在ViewModel中被调用。事件处理与Model更新 :当View中的事件被触发后,ViewModel中的方法会执行相应的业务逻辑。这些业务逻辑可能会涉及到对Model数据的更新。例如,在登录方法login
中,会获取View中用户输入的用户名和密码(通过this.username
和this.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中显示搜索结果的部分。
发布-订阅,观察者模式
观察者模式(Observer Pattern)
概念
观察者模式是一种软件设计模式。在这种模式中有两个主要角色:被观察者(Subject)和观察者(Observer)。被观察者维护一个观察者列表,当被观察者的状态发生变化时,它会通知所有注册的观察者。观察者定义了一个更新接口,当接收到被观察者的通知时,会执行这个更新接口来做出响应。 在Vue中的体现
响应式数据 :Vue的响应式数据系统可以看作是观察者模式的应用。以Vue实例中的data
属性为例,每个被定义在data
中的数据属性都是一个被观察者。当这些数据属性的值发生变化时,它们会通知与之关联的观察者,也就是使用这些数据属性的DOM元素(通过插值表达式、指令等方式关联)。实现细节 :Vue使用Object.defineProperty
(在ES5环境)或者Proxy
(在ES6环境)来进行数据劫持。例如,当使用Object.defineProperty
时,对于data
中的每一个属性,会定义get
和set
方法。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
)时,通知依赖进行更新。 发布 - 订阅模式(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.coloradmin.cn/o/2272364.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!