Vue的核心思想是数据驱动视图和组件化,组件是Vue很重要的功能模块,作用是拆分代码,代码复用等。
全局组件可以在任意的Vue实例中使用,而私有组件只能在一个Vue实例中使用。
举个栗子
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="main" v-cloak>
<mycom4>mycom4>
div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
<script>
var vm = new Vue({
el: '#main',
data: {
msg: "Hello world",
},
methods: {},
//私有组件
components : {
mycom4 : {
//同样可以拆分
template : '私有组件
'
}
}
})
script>
body>
html>
运行效果

在Vue实例对象中,私有组件是components属性,它和data属性、methods属性平级。
components属性值是对象,可以任意创建组件。 mycom4 → 组件名称。
上面栗子中将代码都写在了vm实例对象中,降低了代码阅读性,↓使用私有组件拆分代码。

在components属性中新建了mycom5组件,其值是mycom5变量,mycom5变量存储的就是要渲染的HTML代码。
小tips:
在对象中,当属性名和属性值相同时,可以简写

效果不变。
组件也可以当成一个Vue实例对象,在组件中也可以使用data属性、methods属性以及生命周期函数等,但使用方法不完全一样。
举个栗子
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="main" v-cloak>
<mycom5>mycom5>
div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
<script>
var mycom5 = {
template: '组件---{{msg}}
',
data() {
return {
msg : 'Hello'
}
},
methods: {}
}
var vm = new Vue({
el: '#main',
data: {
msg: "Hello world",
},
methods: {},
//私有组件
components: {
//es6语法简写
mycom5,
}
})
script>
body>
html>
运行效果

可以看到,和template属性平级,可以书写data属性和methods属性,组件中的data与Vue实例中的data用法不同。
Vue实例中的data是一个对象,可以直接写数据,组件中的data是一个方法,并且必须返回一个对象。在return的对象中存储数据,组件中methods属性的使用方法和Vue实例中methods属性的使用方法一样,都是存储的方法。
双组件切换
举个栗子
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="main" v-cloak>
<a @click="tab(1)">登录a>
<a @click="tab(0)">注册a>
<com1 v-if="flag">com1>
<com2 v-else>com2>
div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
<script>
var com1 = {
template : 'login组件
'
}
var com2 = {
template: 'register组件
'
}
var vm = new Vue({
el: '#main',
data: {
msg: "Hello world",
flag : true
},
methods: {
tab(i){
if (i == 1){
this.flag = true
}
else{
this.flag = false
}
}
},
//私有组件
components: {
com1,
com2
}
})
script>
body>
html>
运行效果

多组件切换
使用v-if和v-else只能两个组件之间的切换,使用
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="main" v-cloak>
<a @click="tab('com1')">登录a>
<a @click="tab('com2')">注册a>
<a @click="tab('com3')">首页a>
<component :is="comName">component>
div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
<script>
var com1 = {
template: 'login组件
'
}
var com2 = {
template: 'register组件
'
}
var com3 = {
template: '首页
'
}
var vm = new Vue({
el: '#main',
data: {
comName : 'com1',
msg: "Hello world"
},
methods: {
tab(i) {
this.comName = i
}
},
//私有组件
components: {
com1,
com2,
com3
}
})
script>
body>
html>
运行效果
