4. 全局API的实现原理

4.1 Vue.extend

Vue.extend( options )

【参数】{Object} options
【用法】使用基础Vue构造器创建一个“子类”,其参数是一个包含“组件选项”的对象。
data选项是特例,在Vue.extend()中,它必须是一个函数。

<div id="mount-point"></div>
//创建构造器
var Profile = Vue.extend({
    template:'<p>{{firstName}} {{lastName}} aka {{alias}}</p>',
    data:function(){
        return {
            firstName:'Walter',
            lastName:'White',
            alias:'Heisenberg'
        }
    }
})
//创建Profile实例,并挂载到一个元素上
new Profile().$mount('$mount-point')

//结果如下
<p>Walter White aka Heisenberg</p>

全局API和实例方法不同,后者是在Vue原型上挂载方法,也就是Vue.prototype,而前者是直接在Vue上挂载的方法。extend作用是创建一个子类,让它继承Vue身上的一些功能。
Vue.extend方法内增加了缓存策略,反复调用extend返回同一个结果,再次调用extend方法只需从缓存中取出结果即可。

4.2 Vue.nextTick

Vue.nextTick( [callback,context] )

【参数】{Function} [callback] || {Object} context
【用法】在下次DOM更新循环结束之后执行延迟回调,修改数据之后立即使用这个方法来获取更新后的DOM
【实例】

//修改数据
vm.msg = 'hello'
//DOM还没有更新
Vue.nextTick(function(){ // DOM更新了 })
//作为Promise使用(Vue.js2.1.0新增)
Vue.nextTick().then(function(){ // DOM更新了 })

4.3 Vue.set

Vue.set( target.key,value )

【参数】{Object|Array} target || {string|number} key || {any} value
【返回值】设置的值
【用法】设置对象的属性。如果对象是响应式的,确保属性被创建以后也是响应式的,同时触发视图更新。这个方法主要用于避开Vue不能检测属性被添加后的限制。

4.4 Vue.delete

Vue.delete( target.key )

【参数】{Object|Array} target || {string|number} key/index
【用法】删除对象的属性。如果对象是响应式的,确保属性删除能触发更新视图。这个方法主要用于避开Vue不能检测属性被删除后的限制。

4.5 Vue.directive

Vue.directive( id,[definition] )

【参数】{string} id || {Function|Object} [definition]
【用法】注册或获取全局指令

//注册
Vue.directive('my-directive',{
    bind:function(){},
    inserted:function(){},
    update:function(){},
    componentUpdated:function(){},
    unbind:function(){}
})

//注册(指令函数)
Vue.directive('my-directive',function(){
    //这里会将被bind和update调用
})

//getter方法,返回已注册的指令
var myDirective = Vue.directive('my-directive')

Vue除了默认内置的指令外(v-model\v-show)等等,还允许注册自定义指令,这里directive只是注册和获取指令,并不是让指令生效,注册指令是将指令保存在某个位置,生效是从某个位置拿出来执行。
在Vue构造函数上创建了options属性来存放选项,并在选项上新增了directive方法用于存放指令
如果difinition参数不存在,则使用id从this.options['directives']中读取指令并返回,如果存在,说明是注册操作,那么进而判断definition参数的类型是否是函数,如果是函数,就默认监听bind和update两个事件,如果不是,则说明是用户定义的指令对象,什么都不用做。

4.6 Vue.filter

Vue.filter( id,[definition] )

【参数】{string} id || {Function|Object} [definition]
【用法】注册或获取全局过滤器

//注册
Vue.filter('my-filter',function(value){
    //返回处理后的值
})

//getter方法,返回已注册的过滤器
var myFilter = Vue.filter('my-filter')

Vue允许自定义过滤器,可被用于格式化一些常见的文本。过滤器可以用在双花括号插值和v-bind表达式中。

{{message | capitalize}}
<div v-bind:id="rawId | formatId"></div>

仅仅是注册和获取全局过滤器,并不是使其生效,将过滤器保存在this.options['filters']。
第二个参数不存在 ,则是读取过滤器将其返回,如果存在,说明是注册操作,将该参数保存到选项的filter属性中。

4.7 Vue.component

Vue.component( id,[definition] )

【参数】{string} id || {Function|Object} [definition]
【用法】注册或获取全局组件。注册组件时,还会自动使用给定的id设置组件的名称。

//注册组件,传入一个扩展过的构造器
Vue.component('my-component',Vue.extend({ /* ... */ }))
//注册组件,传入一个选项对象(自动调用Vue.extend)
Vue.component('my-component',{ /* ... */ })
//获取注册的组件(始终返回构造器)
var MyComponent = Vue.component('my-component')

组件保存在this.options['components']。如果definition参数是Object类型,则调用Vue.extend方法将它变成Vue的子类,使用Vue.component方法注册组件;如果选项对象中没有设置组件名,则自动使用给定的id设置组件的名称。

4.8 Vue.use

Vue.use( plugin )

【参数】 {Object|Function} plugin
【用法】 安装Vue.js插件

4.9 Vue.mixin

Vue.use( plugin )

【参数】 {Object} mixin
【用法】 全局注册一个混入(mixin),影响注册之后创建的每个Vue.js实例。插件作者可以使用混入向组件注入自定义行为。

4.10 Vue.compile

Vue.compile( template )

【参数】 {string} template
【用法】 编译模板字符串并返回包含渲染函数的对象。

4.11 Vue.version

【用法】 提供字符串形式的Vue.js安装版本号