1、认识组件
(1) 创建组件的写法
写法: Vue.component("组件名",{ //xx });
//这里是全局注册组件的写法
Vue.component()函数的第一个参数就是组件名
,
比如Vue.component(“my-comname”,{ //xx}}); 那么my-comname就是新建组件的名称;
(2)定义组件名的方式:
使用 kebab-case(短横线分隔命名)
写法:Vue.component('my-component-name', { //xx })
当使用这种方式定义一个组件时,在引用这个自定义元素时也必须使用kebab-case,
比如
。
使用 PascalCase(首字母大写命名)
写法:Vue.component('MyComponentName', { //xx })
当使用这种方式定义一个组件时,你在引用这个自定义元素时两种命名法都可以使用。
即
和
都可以。
注意:直接在DOM(即非字符串的模板)中使用时只有kebab-case是有效的。
(3)注意:
全局注册
和局部注册
。<div id="app">
<button-counter>button-counter>
<hr>
<div id="dv" style="width:200px;height:200px;background-color:lightblue;">
<button-counter>我是#dv下的组件button-counter>
div>
div>
<script src="js/vue.js"></script>
<script>
// 创建组件button-counter
Vue.component('button-counter', {
data: function () {
return {
count: 0
}
},
template: ''
});
/* 本例的组件名字是。我们可以在一个通过new Vue创建的Vue根实例中,
把这个组件作为自定义元素来使用。 */
new Vue({
el: '#app'
});
</script>
2、组件复用
组件的复用:组件可进行任意次数的使用
。
注意:
每一个组件的data,必须是一个函数;
每用一次组件, 就会有一个它的新实例被创建,组件之间不会相互影响。
如下的示例中,当点击按钮时, 每个组件都会控制各自的count(点击次数)。
<div id="app">
<button-counter>button-counter>
<button-counter>button-counter>
<button-counter>button-counter>
div>
<script src="js/vue.js"></script>
<script>
Vue.component("button-counter", {
// 我们定义组件时,它的data并不是如下面这样直接提供一个对象
// data:{
// count:0
// },
// 而是如下这样,一个组件的data选项必须是一个函数
data: function () {
return {
count: 0
}
},
template:``
});
let app = new Vue({
el: "#app"
});
</script>
3、全局注册组件
组件在注册之后可以用在任何新创建的Vue根实例(new Vue) 的模板中。
在所有子组件中也是如此,即这三个子组件在各自内部也都可以相互使用。
<div id="app">
<mycomponet-a>mycomponent-a>
<mycomponent-b>mycomponent-b>
<mycomponent-c>mycomponent-c>
div>
<script src="js/vue.js"></script>
<script>
Vue.component('mycomponent-a', {
data: function () {
return {
poem_title: "唐诗",
poem_name: "《静夜思》- 李白",
poem_content: "床前明月光,疑是地上霜。举头望明月,低头思故乡。"
}
},
template: `{{poem_title}}
{{poem_name}}{{poem_content}}`
});
Vue.component('mycomponent-b', {
data: function () {
return {
songpoem_title: "宋词",
songpoem_name:"《虞美人》- 李煜",
songpoem_content:"春花秋月何时了,往事知多少?小楼昨夜又东风,故国不堪回首月明!雕栏玉砌应犹在,只是朱颜改。问君能有几多愁?恰似一江春水向东流。"
}
},
template: `{{songpoem_title}}
{{songpoem_name}}{{songpoem_content}}`
});
Vue.component('mycomponent-c', {
data: function () {
return {
yuanopera_title: "元曲",
yuanopera_name:"《天净沙-秋思》- 马致远",
yuanopera_content:"枯藤老树昏鸦,小桥流水人家,古道西风瘦马。夕阳西下,断肠人在天涯。"
}
},
template: `{{yuanopera_title}}
{{yuanopera_name}}{{yuanopera_content}}`
});
new Vue({
el: '#app',
})
</script>
4、局部注册组件
全局注册往往是不够理想的。比如,你使用一个像webpack打包项目。
如果是全局注册所有的组件, 那么当你不需要使用某个或某些组件时,
它仍然会包含在你最终的包中。会造成了用户下载不必要的js。
这就需要我们注册局部组件。
对于components 对象中的每个属性来说,其属性名就是自定义元素的名字
,
其属性值就是这个组件的选项对象
。
<div id="app">
<localcom-a message="我是局部组件">localcom-a>
<localcom-b message="我是局部组件的兄弟">localcom-b>
<localcom-c message="上面是我大哥和二哥">localcom-c>
div>
<hr>
<div id="app2">
<mycom-x info="新组件">mycom-x>
<mycom-y info="我也是新组件">mycom-y>
div>
<script src="js/vue.js"></script>
<script>
//由于前面说的全局注册组件带来的问题,我们可以通过一个普通的js对象来定义组件,如下:
var ComponentA = {
props: ["message"],
template: `{{message}}
`
}
var ComponentB = {
props: ["message"],
template: `{{message}}
`
}
var ComponentC = {
props: ["message"],
template: `{{message}}
`
}
// 然后在 components 选项中定义你想要使用的组件:
let app = new Vue({
el: '#app',
components: {
'localcom-a': ComponentA,
'localcom-b': ComponentB,
'localcom-c': ComponentC
}
})
console.log(app);
// 注意:局部注册的组件在其子组件中不可用。
// 比如,你想组件a可以在组件中可用,如下写法:
var myComX = {
props: ["info"],
template: `{{info}}
`
}
var myComY = {
components: {
'mycom-x': myComX
}
}
let app2 = new Vue({
el: "#app2",
components: {
'mycom-x': myComX,
'mycom-y': myComX
}
});
console.log(app2);
// 或者如果你通过 Babel 和 webpack使用ES2015模块,如下:
// import ComponentA from './ComponentA.vue'
// export default {
// components: {
// ComponentA
// },
// // ...
// }
/*注意
在 ES2015+ 中,在对象中放一个类似 ComponentA 的变量名其实是 ComponentA: ComponentA 的缩写,即这个变量名同时是:
用在模板中的自定义元素的名称
包含了这个组件选项的变量名
*/
</script>