需求: 如果页面中有多个一样结构的控件,比如
<div id="app">
<!-- 页面中有多个一样结构的标签: span+button -->
<span>{{count1}}</span> <button @click="changeCount1">按钮</button> <br>
<span>{{count2}}</span> <button @click="changeCount2">按钮</button> <br>
<span>{{count3}}</span> <button @click="changeCount3">按钮</button> <br>
<span>{{count4}}</span> <button @click="changeCount4">按钮</button> <br>
<span>{{count5}}</span> <button @click="changeCount5">按钮</button> <br>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
count1: 0,
count2: 0,
count3: 0,
count4: 0,
count5: 0
},
methods: {
changeCount1() {
this.count1++;
},
changeCount2() {
this.count2++;
},
changeCount3() {
this.count3++;
},
changeCount4() {
this.count4++;
},
changeCount5() {
this.count5++;
}
}
});
</script>
问题:
解决方案: 使用Vue中一个十分重要的特性-组件
体验组件的使用
<div id="app">
<!-- 2. 使用组件 -->
<span-btn></span-btn>
<span-btn></span-btn>
<span-btn></span-btn>
<span-btn></span-btn>
</div>
<script src="./vue.js"></script>
<script>
// 注册全局组件
Vue.component('span-btn', {
template: `
<div>
<span>{{count}}</span>
<button @click="changeCount">按钮</button>
</div>
`,
data() {
return {
count: 0
}
},
methods: {
changeCount() {
this.count++;
}
}
});
new Vue({
el: '#app'
});
</script>
什么是组件:
组件系统是 Vue 的另一个重要概念,允许我们使用小型、独立和通常可复用的组件构建大型应用。
仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树:
例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。
new Vue
接收相同的选项:例如 data
、computed
、watch
、methods
以及生命周期钩子等。el
这样根实例特有的选项建议: 在实际开发中,尽可能使用各种第三方组件
new Vue
) 新创建的 (一个或者多个)Vue 实例
Vue.component('组件名', {
// 组件选项: data methods template等(没有el)
// data 的值是一个函数, 需要返回一个对象
});
<div id="app">
<!-- 2. 使用组件 -->
<span-btn></span-btn>
<span-btn></span-btn>
<span-btn></span-btn>
<span-btn></span-btn>
</div>
<hr>
<div id="app1">
<span-btn></span-btn>
<My-Component></My-Component>
</div>
<hr>
<div id="app2">
<span-btn></span-btn>
</div>
<hr>
<div id="app3">
<span-btn></span-btn>
</div>
<script src="./vue.js"></script>
<script>
// 1. 注册组件
// Vue.component('组件名', {
// // 组件选项: data methods template等
// });
Vue.component('span-btn', {
// template: 页面字符串,有且仅有一个根元素
template: `
<div>
<span>{{count}}</span>
<button @click="changeCount">按钮</button>
</div>
`,
data() {
return {
count: 0
}
},
methods: {
changeCount() {
this.count++;
}
}
});
Vue.component('myComponent', {
template: `
<div>
<h1>{{num}}</h1>
<button @click="changeTitle">按钮</button>
</div>
`,
style: './style.css',
data() {
return {
num: 0
}
},
methods: {
changeTitle() {
this.num++;
}
}
});
new Vue({
el: '#app'
});
new Vue({
el: '#app1'
});
new Vue({
el: '#app2'
});
new Vue({
el: '#app3'
});
</script>
注意:
components
对象中的每个属性来说,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<!-- 2 使用组件 -->
<com-A></com-A>
<com-B></com-B>
<com-C></com-C>
</div>
<script src="./vue.js"></script>
<script>
// 局部组件的选项
const comA = {
template: `<div>{{titleA}}</div>`,
data() {
return {
titleA: 'comA中的data里的titleA'
}
}
};
const comB = {
template: `<div>{{titleB}}</div>`,
data() {
return {
titleB: 'comB中的data里的titleB'
}
}
};
const comC = {
template: `<div>{{titleC}}</div>`,
data() {
return {
titleC: 'comC中的data里的titleC'
}
}
};
new Vue({
el: '#app',
// 1. 在Vue实例中设置components选项{组件名:组件选项}
components: {
// 在页面中的组件名:组件选项
'comA': comA,
'comB': comB,
'comC': comC
}
});
</script>
</body>
</html>
我们可以在new Vue()实例中使用自定义组件, 也可以在注册自定义组件时,嵌套另一个自定义组件,也就是父子组件的关系
<div id="app">
<!-- 2. 通过组件名使用组件 -->
<parent-Com></parent-Com>
</div>
<script src="./vue.js"></script>
<script>
// 1. 注册全局组件
Vue.component('childCom', {
template: `
<div>
<h1>childCom全局组件</h1>
</div>
`
});
Vue.component('parentCom', {
// 在parentCom中嵌入childCom组件
// parentCom和childCom属于父子组件
// 父组件是parentCom
// 子组件是childCom
template: `
<div>
<h1>parentCom全局组件</h1>
<child-Com></child-Com>
</div>
`
});
new Vue({
el: '#app'
});
</script>
<div id="app">
<!-- 2. 通过组件名使用组件 -->
<parent-Com></parent-Com>
</div>
<script src="./vue.js"></script>
<script>
// 1. 局部组件的选项
const childCom = {
template: `
<div>
<h1>childCom局部组件</h1>
</div>
`
};
// 在parentCom组件选项中 使用components选项设置其子组件
// 在template中使用该子组件
const parentCom = {
template: `
<div>
<h1>parentCom局部组件</h1>
<child-Com></child-Com>
</div>
`,
components: {
'childCom': childCom
}
};
new Vue({
el: '#app',
components: {
'parentCom': parentCom
}
});
</script>