介绍
组件(Component)是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展。

注册
全局注册
Vue.component(tagName, options)
如:
1  | // 创建组件构造器  | 
局部注册
通过使用组件实例选项注册,可以使组件仅在另一个实例/组件的作用域中可用:
1  | var Child = {  | 
data
组件的data必须是函数。
1  | var data = { a : 1}  | 
协同工作
在 Vue.js 中,父子组件的关系可以总结为 props down, events up 。父组件通过 props 向下传递数据给子组件,子组件通过 events 给父组件发送消息。
props
组件实例的作用域是孤立的,props是单向的,只能由父组件传递给子组件,反之则会报错。
1  | Vue.component('child', {  | 
结果
1  | <span>hello</span>  | 
注意:
1、html不区分大小写,prop会从 camelCase转为 kebab-case
1  | Vue.component('child', {  | 
2、动态prop
可以用v-bind动态绑定props的值到父组件的数据中。
1  | <div>  | 
3、字面量vs动态语法
1  | <!-- 传递了一个字符串"1" -->  | 
4、改变组件prop值
定义一个局部 data 属性,并将 prop 的初始值作为局部数据的初始值。
1  | props: ['initialCounter'],  | 
prop 作为需要被转变的原始值传入,定义一个 computed 属性,此属性从 prop 的值计算得出
1  | props: ['size'],  | 
5、prop 检测
prop 可以添加检测机制,目前 type 有String、Number、Boolean、Function、Object、Array,也可以自定义类型,使用instanceof检测。
1  | Vue.component('example', {  | 
自定义事件
$on(eventName)监听事件
$emit(eventName)触发事件
1  | <div id="counter-event-example">  | 
若想绑定原生事件,可以用.native修饰v-on
1  | <my-component v-on:click.native="doTheThing"></my-component>  | 
slot(内容分发)
1  | <app>  | 
1、<app> 组件不知道它的挂载点会有什么内容。挂载点的内容是由<app>的父组件决定的。
2、<app> 组件很可能有它自己的模版。
编译作用域
1  | <child-component>  | 
上面例子出现无效的原因是:假定 someChildProperty 是子组件的属性,上例不会如预期那样工作。父组件模板不应该知道子组件的状态。
如果要绑定子组件内的指令到一个组件的根节点,应当在它的模板内这么做:
1  | Vue.component('child-component', {  | 
slot简单来说就在包装在子组件里的其他元素。
1  | <!-- 组件模板 -->  | 
渲染结果为:
1  | <div class="container">  | 
动态组件
使用保留的 <component> 元素,动态地绑定到它的 is 特性:
1  | var vm = new Vue({  | 
keep-alive
切换出去的组件保留在内存中,可以保留它的状态或避免重新渲染。
1  | <keep-alive>  | 
学习参考文章(v1.0):