Vue.js入门(一)--MVVM框架理解

入门VUE

开始在某公司实习,第一个接手的项目是用vue+bootstrap搭建网页。开始读官网https://cn.vuejs.org/v2的入门教程和API,有些吃力。想先了解一下此框架大致的内容和原理。javascript


MVC、MVP、MVVM模型原理

参考了阮大大的博客文章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 的出现,完美解决了以上三个问题

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模型的联系

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生命周期图

图片描述

实例生命周期

每一个 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、选项、实例属性、实例方法、指令、特殊属性、内置组件等。

相关文章
相关标签/搜索