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.rhkb.cn/news/502477.html
如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!