您现在的位置是:首页 > 编程 > 

【Vue.js】015

2025-07-27 13:04:03
【Vue.js】015 三、Vue中的MVVM1、MVVM概述MVVM(Model–View–Viewmodel)是一种软件架构模式;MVVM有助于将图形用户界面的开发与业务逻辑或后端逻辑(数据模型)的开发分离开来,这是通过置标语言或GUI代码实现的。MVVM的视图模型是一个值转换器, 这意味着视图模型负责从模型中暴露(转换)数据对象,以便轻松管理和呈现对象。在这方面,视图模型比视图做得更多,并且

【Vue.js】015

三、Vue中的MVVM

1、MVVM概述

MVVM(Model–View–Viewmodel)是一种软件架构模式;

MVVM有助于将图形用户界面的开发与业务逻辑或后端逻辑(数据模型)的开发分离开来,这是通过置标语言GUI代码实现的。MVVM的视图模型是一个值转换器, 这意味着视图模型负责从模型中暴露(转换)数据对象,以便轻松管理和呈现对象。在这方面,视图模型比视图做得更多,并且处理大部分视图的显示逻辑。 视图模型可以实现中介者模式,组织对视图所支持的用例集的后端逻辑的访问;

MVVM是马丁·福勒的PM(Presentation Model)设计模式的变体。 MVVM以相同的方式抽象出视图的状态和行为,但PM以不依赖于特定用户界面平台的方式抽象出视图(创建了视图模型);

MVVM和PM都来自MVC模式;

MVVM由微软架构师Ken Cooper和Ted Peters开发,通过利用WPF(微软.ET图形系统)和Silverlight(WPF的互联网应用派生品)的特性来简化用户界面的事件驱动程序设计。 微软的WPF和Silverlight架构师之一John Gossman于2005年在他的博客上发表了MVVM;

MVVM也被称为model-view-binder,特别是在不涉及.ET平台的实现中。ZK(Java写的一个Web应用框架)和KnockoutJS(一个JavaScript库)使用model-view-binder;

简化:MVVM是MVC的改进版;

MVC中的M就是单纯的从网络获取回来的数据模型,V指的我们的视图界面,而C就是我们的ViewController;

在其中,ViewController负责ViewModel之间调度,View发生交互事件会通过target-action或者delegate方式回调给ViewController,与此同时ViewController还要承担把Model通过KVO、otification方式传来的数据传输给View用于展示的责任。随着业务越来越复杂,视图交互越复杂,导致Controller越来越臃肿,负重前行。脏活累活都它干了,到头来还一点不讨好。福报修多了的结果就是,不行了就重构你,重构不了就换掉你;

来一张斯坦福老头经典的MVC架构图:

所以为了解决这个问题,MVVM就闪亮登场了。他把View和Contrller都放在了View层(相当于把Controller一部分逻辑抽离了出来),Model层依然是服务端返回的数据模型。而ViewModel充当了一个UI适配器的角,也就是说View中每个UI元素都应该在ViewModel到与之对应的属性。除此之外,从Controller抽离出来的与UI有关的逻辑都放在了ViewModel中,这样就减轻了Controller的负担;

我简单的画了下MVVM的架构图:

从以上的架构图中,我们可以很清晰的梳理出各自的分工;

View层视图展示。包含UIView以及UIViewControllerView层是可以持有ViewModel的

ViewModel层视图适配器。暴露属性与View元素显示内容或者元素状态一一对应。一般情况下ViewModel暴露的属性建议是readOnly的,至于为什么,我们在实战中会去解释。还有一点,ViewModel层是可以持有Model的

Model层数据模型与持久化抽象模型。数据模型很好理解,就是从服务器拉回来的JSO数据。而持久化抽象模型暂时放在Model层,是因为MVVM诞生之初就没有对这块进行很细致的描述。按照经验,我们通常把数据库、文件操作封装成Model,并对外提供操作接口。(有些公司把数据存取操作单拎出来一层,称之为DataAdapter层,所以在业内会有很多MVVM的变种,但其本质上都是MVVM);

BinderMVVM的灵魂。可惜在MVVM这几个英文单词中并没有它的一席之地,它的最主要作用是在ViewViewModel之间做了双向数据绑定。如果MVVM没有Binder,那么它与MVC的差异不是很大;

2、Vue中的MVVM

结构图示:
实例图示:
四、Vue的opti选项

1、参考文档

2、先掌握三个

el:

类型string | Element

限制:只在用 new 创建实例时生效;

详细

提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标。可以是 CSS 选择器,也可以是一个 HTMLElement 实例

在实例挂载之后,元素可以用 vm.$el 访问;

如果在实例化时存在这个选项,实例将立即进入编译过程,否则,需要显式调用 vm.$mount() 手动开启编译;

简化:用来决定vue实例所管理的是那个DOM元素;

data:

类型Object | Function

限制:组件的定义只接受 function

详细

Vue 实例的数据对象。Vue 将会递归将 data 的 property 转换为 getter/setter,从而让 data 的 property 能够响应数据变化。对象必须是纯粹的对象 (含有零个或多个的 key/value 对):浏览器 API 创建的原生对象,原型上的 property 会被忽略。大概来说,data 应该只能是数据 - 不推荐观察拥有状态行为的对象;

一旦观察过,你就无法在根数据对象上添加响应式 property。因此推荐在创建实例之前,就声明所有的根级响应式 property;

实例创建之后,可以通过 vm.data 访问原始数据对象。Vue 实例也代理了 data 对象上所有的 property,因此访问 vm.a 等价于访问 vm.data.a;

以 _ 或 开头的 property 不会被 Vue 实例代理,因为它们可能和 Vue 内置的 property、API 方法冲突。你可以使用例如 vm.data._property 的方式访问这些 property;

当一个组件被定义,data 必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例。如果 data 仍然是一个纯粹的对象,则所有的实例将共享引用同一个数据对象!通过提供 data 函数,每次创建一个新实例后,我们能够调用 data 函数,从而返回初始数据的一个全新副本数据对象;

如果需要,可以通过将 vm.$data 传入 JSO.parse(JSO.stringify(...)) 得到深拷贝的原始数据对象;

实例:

代码语言:javascript代码运行次数:0运行复制
var data = { a: 1 }

// 直接创建一个实例
var vm = new Vue({
  data: data
})
vm.a // => 1
vm.$data === data // => true

// () 中 data 必须是函数
var Component = ({
  data: function () {
    return { a: 1 }
  }
})

注意,如果你为 data property 使用了箭头函数,则 this 不会指向这个组件的实例,不过你仍然可以将其实例作为函数的第一个参数来访问;

代码语言:javascript代码运行次数:0运行复制
data: vm => ({ a:  })

简化:用来定义数据;

methods:

类型{ [key: string]: Function }

详细

methods 将被混入到 Vue 实例中。可以直接通过 VM 实例访问这些方法,或者在指令表达式中使用。方法中的 this 自动绑定为 Vue 实例;

注意:

注意,不应该使用箭头函数来定义 method 函数 (例如 plus: () => this.a++)。理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例,this.a 将是 undefined;

示例:

代码语言:javascript代码运行次数:0运行复制
var vm = new Vue({
  data: { a: 1 },
  methods: {
    plus: function () {
      this.a++
    }
  }
})
vm.plus()
vm.a // 2

简化:用来定义函数;

补充:

什么时候称为方法,什么时候成为函数?

方法:method;

函数:function;

在类中叫方法,在类外叫函数;

因为方法一般是实例的方法;

当然一般情况下是不需要区分的,只做了解;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent 删除数据mvvm对象函数模型

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1198998.html

相关标签:无
上传时间: 2025-07-23 13:39:36
留言与评论(共有 12 条评论)
本站网友 阜阳房屋出租
29分钟前 发表
这意味着视图模型负责从模型中暴露(转换)数据对象
本站网友 时代新世界
25分钟前 发表
从而让 data 的 property 能够响应数据变化
本站网友 玛雅论坛亚洲电影
25分钟前 发表
原型上的 property 会被忽略
本站网友 花都二手房出售
21分钟前 发表
所以在业内会有很多MVVM的变种
本站网友 轻质墙板
27分钟前 发表
{ plus
本站网友 骨髓穿刺术
2分钟前 发表
MVVM就闪亮登场了
本站网友 上海长江医院
13分钟前 发表
但其本质上都是MVVM);Binder:MVVM的灵魂
本站网友 成都找工作
11分钟前 发表
这是通过置标语言或GUI代码实现的
本站网友 金水租房
13分钟前 发表
暴露属性与View元素显示内容或者元素状态一一对应
本站网友 fungus
4分钟前 发表
需要显式调用 vm.$mount() 手动开启编译;简化:用来决定vue实例所管理的是那个DOM元素;data:类型:Object | Function限制:组件的定义只接受 function;详细:Vue 实例的数据对象
本站网友 i618
2分钟前 发表
Function };详细:methods 将被混入到 Vue 实例中