开始在某公司实习,第一个接手的项目是用vue+bootstrap搭建网页。开始读官网https://cn.vuejs.org/v2的入门教程和API,有些吃力。想先了解一下此框架大致的内容和原理。javascript
参考了阮大大的博客文章http://www.ruanyifeng.com/blo...,总结了下图:html
总结:这三种模式的区别主要在于中间层,也就是MVC的控制层所起到的做用的差异。
参考博客http://www.cnblogs.com/onepix...,说明了MVC模式不那么适合前段开发的理由:前端
这种 MVC 架构模式对于简单的应用来看起是OK 的,也符合软件架构的分层思想。 但实际上,随着H5 的不断发展,人们更但愿使用H5开发的应用能和Native媲美,或者接近于原生App的体验效果,因而前端应用的复杂程度已不一样往日,今非昔比。这时前端开发就暴露出了三个痛点问题:vue
一、开发者在代码中大量调用相同的 DOM API, 处理繁琐 ,操做冗余,使得代码难以维护。java
二、大量的DOM 操做使页面渲染性能下降,加载速度变慢,影响用户体验。jquery
三、当 Model 频繁发生变化,开发者须要主动更新到View ;当用户的操做致使 View 发生变化,开发者一样须要将变化的数据同步到Model 中,这样的工做不只繁琐,并且很难维护复杂多变的数据状态。bootstrap
其实,早期jquery 的出现就是为了前端能更简洁的操做DOM 而设计的,但它只解决了第一个问题,另外两个问题始终伴随着前端一直存在。数组
----------架构
MVVM 由 Model,View,ViewModel 三部分构成,Model 层表明数据模型,也能够在Model中定义数据修改和操做的业务逻辑;View 表明UI 组件,它负责将数据模型转化成UI 展示出来,ViewModel 是一个同步View 和 Model的对象。mvc
在MVVM架构下,View 和 Model 之间并无直接的联系,而是经过ViewModel进行交互,Model 和 ViewModel 之间的交互是双向的, 所以View 数据的变化会同步到Model中,而Model 数据的变化也会当即反应到View 上。
ViewModel 经过双向数据绑定把 View 层和 Model 层链接了起来,而View 和 Model 之间的同步工做彻底是自动的,无需人为干涉,所以开发者只需关注业务逻辑,不须要手动操做DOM, 不须要关注数据状态的同步问题,复杂的数据状态维护彻底由 MVVM 来统一管理。
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 追踪依赖,在属性被访问和修改时通知变化。
Observer
数据监听器,可以对数据对象的全部属性进行监听,若有变更可拿到最新值并通知订阅者,内部采用Object.defineProperty的getter和setter来实现。Compile 指令解析器,它的做用对每一个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数。
Watcher 订阅者, 做为链接 Observer 和 Compile
的桥梁,可以订阅并收到每一个属性变更的通知,执行指令绑定的相应回调函数。Dep 消息订阅器,内部维护了一个数组,用来收集订阅者(Watcher),数据变更触发notify 函数,再调用订阅者的 update
方法。
我是这样理解vue框架对应MVVM模型关系的:
Observer至关于Model层观察vue实例中的data数据,当数据发生变化时,通知Watcher订阅者。
Compile指令解析器位于View层,初始化View的视图,将数据变化与更新函数绑定,传给Watcher订阅者。
Watcher是整个模型的核心,对应ViewModel层,链接Observer和Compile。全部的Watchers存于Dep订阅器中,Watcher将Observer监听到的数据变化对应相应的回调函数,处理数据,反馈给View层更新界面视图。
每一个 Vue 实例在被建立以前都要通过一系列的初始化过程。例如,实例须要配置数据观测(data observer)、编译模版、挂载实例到 DOM ,而后在数据变化时更新 DOM 。在这个过程当中,实例也会调用一些 生命周期钩子 ,这就给咱们提供了执行自定义逻辑的机会。例如,created 这个钩子在实例被建立以后被调用:
<!DOCTYPE html> <html> <head> <title></title> <meta charset="utf-8"> <script src="http://unpkg.com/vue/dist/vue.js"></script> <script type="text/javascript"> window.onload = function(){ new Vue({ el:'#box', data:{ msg:'welcome' }, created:function(){ console.log('实例已经建立,msg变量还未渲染到模板') }, mounted:function(){ console.log('已经挂载到模板上:msg变量渲染到模板') }, updated:function(){ console.log('实例更新啦') }, destroyed:function(){ console.log('销毁啦') } }); } </script> </head> <body> <div id="box"> <input type="text" v-model="msg"><br/> {{msg}} </div> </body> </html>
接下来要学习Vue.js中的API,包括全局API、选项、实例属性、实例方法、指令、特殊属性、内置组件等。