介绍
组件(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):