如果我们将一个页面所有的处理逻辑全部放在一起,处理起来就会变得非常复杂,而且不利于后续的管理以及扩展。但如果我们讲一个页面拆分成一个个小的功能块,每个功能块完成属于自己这部分独立的功能,那么之后整个页面的管理和维护就变得非常容易了。降低代码耦合度。
组件使用分成三个步骤
①调用Vue.extend()方法创建组件构造器(ES6中继承)
通常在创建组件构造器时,传入template代表我们自定义组件的模板(是以对象的形式),该模板就是在使用到组件的地方,要显示的HTML代码。
②调用Vue.component()方法注册组件
将刚才创建的组件构造器注册为一个组件,并且给他起一个组件的标签名称。
需要传递两个参数:一个时注册组件的标签名,一个是组件构造器
③在Vue实例的作用范围内使用组件
必须在实例范围内使用组件,可以在实例作用范围内嵌套使用。
<div id="app">
<cpn>cpn> //3:使用组件
div>
body>
<script src="../js/vue.js">script>
<script>
//1:创建组件构造器对象
const cpncontructor = Vue.extend({
template:`
我是标题
我是内容
`
}
)
//2:注册组件
Vue.component('cpn',cpncontructor)
const app= new Vue({
el:'#app',
data:{
message:'nihao',
}
})
script>
全局组件意味着可以在多个vue的实例下使用
Vue.component('cpn',cpncontructor);
去固定的Vue实例下注册组件就是局部组件了,实例中components属性
const app = new Vue({
el:'#app',
data:{
message:'你好',
},
components:{
//cpn使用组件时对应的标签名
cpn:cpnconstructor
}
})
组件与组件之间存在层级关系,而其中一种非常重要的关系就是父子组件的关系
<div id="app">
<cpn1>cpn1>
div>
body>
<script src="../js/vue.js">script>
<script>
const cpn2 = Vue.extend({
template:`
我是标题2
我是内容
`
}
);
//cpn2为子 cpn1为父 但是cpn2要在cpn1之前定义
const cpn1 = Vue.extend({
template:`
我是标题1
我是内容
`,
components:{
cpn2:cpn2,
}
}
);
const app= new Vue({
el:'#app',
data:{
message:'nihao',
},
components:{
//注册局部组件
cpn1:cpn1,
}
})
script>
//全局组件
Vue.component('cpn',{
template:`
我是标题2
我是内容
`
})
//局部组件
const app= new Vue({
el:'#app',
data:{
message:'nihao',
},
components:{
cpn:{
template:`
我是标题
我是内容
`
} //注册局部组件
}
})
script标签 注意:类型必须是text/x-template
<body>
<div id="app">
<cpn>cpn>
div>
body>
<script src="../js/vue.js">script>
<script type="text/x-template" id="cpn">
<div>
<h2>我是模板组件分开标题</h2>
</div>
script>
<script>
//注册全局组件
Vue.component('cpn',{
template:'#cpn', //找到模板的id
});
const app = new Vue({
el:'#app',
})
script>
<body>
<div id="app">
<cpn>cpn>
div>
body>
<script src="../js/vue.js">script>
<template id="cpn">
<div>
<h2>我是模板组件分开标题h2>
div>
template>
<script>
//注册全局组件
Vue.component('cpn',{
template:'#cpn',
});
const app = new Vue({
el:'#app',
})
script>
vue实例顶层中的data无法运用于组件当中,必须在注册组件的时候和template模板属性一样有一个data属性,但是data必须是一个函数,函数返回一个对象,对象内部保存着数据。data不能直接保存对象,会报错。
Vue.component('cpn',{
template:'#cpn',
data(){
return {
title:'abc'
}
}
})
组件实例之间共用的不是同一个data数据:
每次data中函数会创建新的块级作用域所以之间的数据互不干扰。
这就是为什么data需要用一个函数来返回对象。
如果就是想共享的话,可以采取以下措施:
const obj = {
counter:0
}
Vue.component('cpn',{
template:'#cpn',
data(){
return obj; //每次调用都是同一个对象
}
})