为什么会出现 MVVM我接触MVVM 是在2015年可以说2015年是MVVM 最火热的一年而在这之前我所知道的就是MVC, MVC 大约是在5年前也就是2011年的时候接触的那时候刚学编程语言学的Java而Java 中经典的 SSH 框架就用来构建一个标准的MVC 框架。说实话MVC 用了这么多年但始终没有很深刻的理解只停留在用的层面 一直到接触 Vue.js 之后研究了MVVM 架构思想然后再回头看 MVC 才有一种豁然开朗的感觉~MVC 即 Model-View-Controller 的缩写就是模型-视图-控制器, 也就是说一个标准的Web 应用程序是由这三部分组成的View用来把数据以某种方式呈现给用户。Model其实就是数据。Controller接收并处理来自用户的请求并将 Model 返回给用户。在HTML5 还未火起来的那些年MVC 作为Web 应用的最佳实践是OK 的这是因为 Web 应用的View 层相对来说比较简单前端所需要的数据在后端基本上都可以处理好View 层主要是做一下展示那时候提倡的是 Controller 来处理复杂的业务逻辑所以View 层相对来说比较轻量就是所谓的瘦客户端思想。2010年到2011年HTML5概念被热炒受到追捧2012年W3C 正式宣布HTML5规范已经正式定稿。2013年我刚进公司就接触了第一个 HTML5 框架Sench touch, 它是一款用来构建移动应用的HTML5 框架它将前后端彻底分离前端采用MVC 架构作为一个独立的项目工程来维护。前端为什么要工程化要使用 MVC相对 HTML4 , HTML5 最大的亮点是它为移动设备提供了一些非常有用的功能使得 HTML5 具备了开发App的能力, HTML5开发App 最大的好处就是跨平台、快速迭代和上线节省人力成本和提高效率因此很多企业开始对传统的App进行改造逐渐用H5代替Native到2015年的时候市面上大多数App 或多或少嵌入都了H5 的页面。既然要用H5 来构建 App, 那View 层所做的事就不仅仅是简单的数据展示了它不仅要管理复杂的数据状态还要处理移动设备上各种操作行为等等。因此前端也需要工程化也需要一个类似于MVC 的框架来管理这些复杂的逻辑使开发更加高效。 但这里的 MVC 又稍微发了点变化ViewUI布局展示数据。Model管理数据。Controller响应用户操作并将 Model 更新到 View 上。这种 MVC 架构模式对于简单的应用来看起是OK 的也符合软件架构的分层思想。 但实际上随着H5 的不断发展人们更希望使用H5 开发的应用能和Native 媲美或者接近于原生App 的体验效果于是前端应用的复杂程度已不同往日今非昔比。这时前端开发就暴露出了三个痛点问题开发者在代码中大量调用相同的 DOM API, 处理繁琐 操作冗余使得代码难以维护。大量的DOM 操作使页面渲染性能降低加载速度变慢影响用户体验。当 Model 频繁发生变化开发者需要主动更新到View 当用户的操作导致 Model 发生变化开发者同样需要将变化的数据同步到Model 中这样的工作不仅繁琐而且很难维护复杂多变的数据状态。其实早期jquery 的出现就是为了前端能更简洁的操作DOM 而设计的但它只解决了第一个问题另外两个问题始终伴随着前端一直存在。MVVM 的出现完美解决以上三个问题MVVM 由 Model,View,ViewModel 三部分构成Model 层代表数据模型也可以在Model中定义数据修改和操作的业务逻辑View 代表UI 组件它负责将数据模型转化成UI 展现出来ViewModel 是一个同步View 和 Model的对象。在MVVM架构下View 和 Model 之间并没有直接的联系而是通过ViewModel进行交互Model 和 ViewModel 之间的交互是双向的 因此View 数据的变化会同步到Model中而Model 数据的变化也会立即反应到View 上。ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来而View 和 Model 之间的同步工作完全是自动的无需人为干涉因此开发者只需关注业务逻辑不需要手动操作DOM, 不需要关注数据状态的同步问题复杂的数据状态维护完全由 MVVM 来统一管理。Vue.js 细节Vue.js 可以说是MVVM 架构的最佳实践专注于 MVVM 中的 ViewModel不仅做到了数据双向绑定而且也是一款相对比较轻量级的JS 库API 简洁很容易上手。Vue的基础知识网上有现成的教程此处不再赘述 下面简单了解一下 Vue.js 关于双向绑定的一些实现细节Vue.js 是采用 Object.defineProperty 的 getter 和 setter并结合观察者模式来实现数据绑定的。当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时Vue 将遍历它的属性用 Object.defineProperty 将它们转为 getter/setter。用户看不到 getter/setter但是在内部它们让 Vue 追踪依赖在属性被访问和修改时通知变化。
Vue.js 和 MVVM 小细节
发布时间:2026/7/2 2:47:32
为什么会出现 MVVM我接触MVVM 是在2015年可以说2015年是MVVM 最火热的一年而在这之前我所知道的就是MVC, MVC 大约是在5年前也就是2011年的时候接触的那时候刚学编程语言学的Java而Java 中经典的 SSH 框架就用来构建一个标准的MVC 框架。说实话MVC 用了这么多年但始终没有很深刻的理解只停留在用的层面 一直到接触 Vue.js 之后研究了MVVM 架构思想然后再回头看 MVC 才有一种豁然开朗的感觉~MVC 即 Model-View-Controller 的缩写就是模型-视图-控制器, 也就是说一个标准的Web 应用程序是由这三部分组成的View用来把数据以某种方式呈现给用户。Model其实就是数据。Controller接收并处理来自用户的请求并将 Model 返回给用户。在HTML5 还未火起来的那些年MVC 作为Web 应用的最佳实践是OK 的这是因为 Web 应用的View 层相对来说比较简单前端所需要的数据在后端基本上都可以处理好View 层主要是做一下展示那时候提倡的是 Controller 来处理复杂的业务逻辑所以View 层相对来说比较轻量就是所谓的瘦客户端思想。2010年到2011年HTML5概念被热炒受到追捧2012年W3C 正式宣布HTML5规范已经正式定稿。2013年我刚进公司就接触了第一个 HTML5 框架Sench touch, 它是一款用来构建移动应用的HTML5 框架它将前后端彻底分离前端采用MVC 架构作为一个独立的项目工程来维护。前端为什么要工程化要使用 MVC相对 HTML4 , HTML5 最大的亮点是它为移动设备提供了一些非常有用的功能使得 HTML5 具备了开发App的能力, HTML5开发App 最大的好处就是跨平台、快速迭代和上线节省人力成本和提高效率因此很多企业开始对传统的App进行改造逐渐用H5代替Native到2015年的时候市面上大多数App 或多或少嵌入都了H5 的页面。既然要用H5 来构建 App, 那View 层所做的事就不仅仅是简单的数据展示了它不仅要管理复杂的数据状态还要处理移动设备上各种操作行为等等。因此前端也需要工程化也需要一个类似于MVC 的框架来管理这些复杂的逻辑使开发更加高效。 但这里的 MVC 又稍微发了点变化ViewUI布局展示数据。Model管理数据。Controller响应用户操作并将 Model 更新到 View 上。这种 MVC 架构模式对于简单的应用来看起是OK 的也符合软件架构的分层思想。 但实际上随着H5 的不断发展人们更希望使用H5 开发的应用能和Native 媲美或者接近于原生App 的体验效果于是前端应用的复杂程度已不同往日今非昔比。这时前端开发就暴露出了三个痛点问题开发者在代码中大量调用相同的 DOM API, 处理繁琐 操作冗余使得代码难以维护。大量的DOM 操作使页面渲染性能降低加载速度变慢影响用户体验。当 Model 频繁发生变化开发者需要主动更新到View 当用户的操作导致 Model 发生变化开发者同样需要将变化的数据同步到Model 中这样的工作不仅繁琐而且很难维护复杂多变的数据状态。其实早期jquery 的出现就是为了前端能更简洁的操作DOM 而设计的但它只解决了第一个问题另外两个问题始终伴随着前端一直存在。MVVM 的出现完美解决以上三个问题MVVM 由 Model,View,ViewModel 三部分构成Model 层代表数据模型也可以在Model中定义数据修改和操作的业务逻辑View 代表UI 组件它负责将数据模型转化成UI 展现出来ViewModel 是一个同步View 和 Model的对象。在MVVM架构下View 和 Model 之间并没有直接的联系而是通过ViewModel进行交互Model 和 ViewModel 之间的交互是双向的 因此View 数据的变化会同步到Model中而Model 数据的变化也会立即反应到View 上。ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来而View 和 Model 之间的同步工作完全是自动的无需人为干涉因此开发者只需关注业务逻辑不需要手动操作DOM, 不需要关注数据状态的同步问题复杂的数据状态维护完全由 MVVM 来统一管理。Vue.js 细节Vue.js 可以说是MVVM 架构的最佳实践专注于 MVVM 中的 ViewModel不仅做到了数据双向绑定而且也是一款相对比较轻量级的JS 库API 简洁很容易上手。Vue的基础知识网上有现成的教程此处不再赘述 下面简单了解一下 Vue.js 关于双向绑定的一些实现细节Vue.js 是采用 Object.defineProperty 的 getter 和 setter并结合观察者模式来实现数据绑定的。当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时Vue 将遍历它的属性用 Object.defineProperty 将它们转为 getter/setter。用户看不到 getter/setter但是在内部它们让 Vue 追踪依赖在属性被访问和修改时通知变化。