定义组件
全局注册
因为组件是可复用的 Vue 实例,所以它们与 new Vue
接收相同的选项,例如 data(必须是一个函数)
、computed
、watch
、methods
以及生命周期钩子等
需要注意的是组件模板需要被一个根元素包裹,而且组件名称建议使用短横线分隔命名
:
1 | <div id="learning-vue"> |
1 | // 定义一个名为 button-counter 的新组件 |
局部注册
1 | <template> |
1 | import Vue from 'vue' |
prop
父组件向子组件传递数据
使用 DOM 中的模板时,camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名) 命名
1 | <div id="learning-vue"> |
1 | Vue.component('post-list', { |
所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。
监听子组件事件
子组件向父子间传值
1 | <post-list v-on:click-me="clickMe" v-for="post in posts" :post="post"></post-list> |
1 | Vue.component('post-list', { |
插槽
和 HTML 元素一样,我们经常需要向一个组件传递内容
1 | <slot-box> |
1 | Vue.component('slot-box', { |
具名插槽
<slot>
元素有一个特殊的特性:name
。这个特性可以用来定义额外的插槽
1 | <slot-name-box> |
1 | Vue.component('slot-name-box', { |
具名插槽缩写:
1 | <slot-name-box> |
作用域插槽
插槽中内容能够访问子组件中的数据
1 | <slot-box :name1="name" :name2="name"> |
将包含所有插槽 prop 的对象命名为 slotProps
,但你也可以使用任意你喜欢的名字。
1 | Vue.component('slot-box', { |
绑定在<slot>
元素上的特性被称为插槽 prop
访问元素或组件
$root
、$parent
和$refs
1 |
|