VUE复习笔记12(深入研究组件)
组件注册
组件名称
在注册组件的时候,我们始终需要给他一个名字。
比如在全局注册的时候:
Vue.component('my-component',{组件代码})
其中的第一个参数就是组件名称,第二个则是组件代码。通常组件代码也会用一个变量表示。
给组件的名字也依赖于他的用途,建议使用语义化的,使用小写和连字符的形式。这样可以避免与当前与未来的Html冲突。
你也可以在风格指南中查阅到关于组件名的其它建议。
组件名大小写
定义组件名的方法有2种
①使用 kebab-case,横线连接符
当使用 kebab-case (短横线分隔命名) 定义一个组件时,你也必须在引用这个自定义元素时使用 kebab-case,例如 <my-component-name>。
②使用 PascalCase,驼峰方式
当使用 PascalCase (驼峰式命名) 定义一个组件时,你在引用这个自定义元素时两种命名法都可以使用。也就是说 <my-component-name> 和 <MyComponentName> 都是可接受的。注意,尽管如此,直接在 DOM (即非字符串的模板) 中使用时只有 kebab-case 是有效的。
全局注册
到目前为止,我们都只是用过 Vue.component来创建组件。
Vue.component('my-component-name', {
// ... 选项 ...
})
这些组件都是全局注册的,也就是说,这些组件在创建出来以后都可以在任何新创建的 Vue 实例中使用。
Vue.component('component-a', { /* ... */ })
Vue.component('component-b', { /* ... */ })
Vue.component('component-c', { /* ... */ })
new Vue({ el: '#app' })
<div id="app">
<component-a></component-a>
<component-b></component-b>
<component-c></component-c>
</div>
在所有子组件中也是如此,也就是说这三个组件在各自内部也都可以相互使用。
局部注册
全局注册往往是不够理想的,比如你想用一个像webpack这样的构建系统。全局注册所有的组件意味着,意味着你已经不再使用一个组件了,他还是会包含在你的最终构建结果中,这造成了用户下载js无畏的增加。
在这样的情况下,你可以通过一个普通的js来定义一个组件。
var ComponentA = { /* ... */ }
var ComponentB = { /* ... */ }
var ComponentC = { /* ... */ }
然后在components选项中定义所需要的插件:
new Vue({
el: '#app'
components: {
'component-a': ComponentA,
'component-b': ComponentB
}
})
对于components对象中的每个属性来说,其属性名就是自定义 元素/组件 的名字,他的值就是这个组件的选项对象。
注意,局部注册的组件在他的子组件中不可使用。
也就是如上的例子,
componentA
在componentB
中不可使用,
如果你希望 ComponentA
在 ComponentB
中可用,则你需要这样写:
var ComponentA = { /* ... */ }
var ComponentB = {
components: {
'component-a': ComponentA
},
// ...
}
或者如果你通过 Babel 和 webpack 使用 ES2015 模块,那么代码看起来更像:
import ComponentA from './ComponentA.vue'
export default {
components: {
ComponentA
},
// ...
}
注意在 ES2015+ 中,在对象中放一个类似 ComponentA 的变量名其实是 ComponentA: ComponentA 的缩写,即这个变量名同时是:
用在模板中的自定义元素的名称
包含了这个组件选项的变量名
模块系统
如果你没有通过 import/require
使用一个模块系统,也许可以暂且跳过这个章节。如果你使用了,那么我们会为你提供一些特殊的使用说明和注意事项。
在模块系统中局部注册
我们推荐在项目文件夹中创建一个 components 目录,并将每个组件放置在他响应的文件夹中。
然后我们需要在局部注册或者全局注册之前,导入这个组件。
import ComponentA from './ComponentA'
import ComponentC from './ComponentC'
export default {
components: {
ComponentA,
ComponentC
},
// ...
}
现在 ComponentA 和 ComponentC 都可以在 ComponentB 的模板中使用了。