创建私有组件
5.1 节介绍了创建全局组件的3种方式,全局组件可以在任意的 Vue 实例中使用,而私有组件只能在一个 Vue 实例中使用,下面开始创建私有组件,代码如下。
视图层代码如下。
<div id="main">
<mycom4></mycom4>
</div>
Vue 实例代码如下。
<script>
var vm = new Vue({
el: '#main',
data: {},
methods: {},
// 私有组件
components: {
mycom4: {
// 同样可以拆分
template: '<h1>私有组件</h1>'
}
}
});
</script>
代码解析如下。
在 Vue 实例对象中,私有组件是 components 属性,它和 data 属性、methods 属性平级。components 属性值为对象,可以任意创建组件,上述代码中的 mycom4 是组件名字。
由于代码都写在 vm 实例对象中,降低了代码阅读性,为解决这个问题可以使用私有组件拆分代码,代码如下。
视图层代码如下。
<div id="main">
<mycom4></mycom4>
<mycom5></mycom5>
</div>
vm 实例代码如下。
<script>
var mycom5 = {
template: '<h1>私有组件拆分</h1>'
};
var vm = new Vue({
el: '#main',
data: {},
methods: {},
components: {
mycom4: {
template: '#temp2'
},
// mycon5: mycom5
// ES6 语法简写成 mycom5
mycom5
}
});
</script>
代码解析如下。
在 components 属性中新建 mycom5 组件,其值是 mycom5 变量,mycom5 变量所储存的就是要渲染的 HTML 代码。
在对象中,当属性名和属性值相同时可以简写,所以组件代码可以这样写,如下所示。
<script>
var mycom5 = {
template: '<h1>私有组件拆分</h1>'
};
var vm = new Vue({
el: '#main',
data: {},
methods: {},
components: {
mycom4: {
template: '#temp2'
},
mycom5
}
});
</script>
使用 es6 语法,简写成 mycom5。
组件中的 data 和 methods
可以把组件当成一个 Vue 实例对象,在 Vue 实例对象中使用过 data 属性、methods 属性以及生命周期函数等,在组件中同样也可以使用这些属性,但使用方法并不完全一样,例如以下组件代码。
<script>
var mycom5 = {
template: '<h1>组件--{{ msg }}</h1>',
data() {
return {
msg: 'Hello'
};
},
methods: {}
};
var vm = new Vue({
el: '#main',
data: {},
methods: {},
components: {
// ES6 语法简写成 mycom5
mycom5
}
});
</script>
代码解析如下。
和 template 属性平级,可以写 data 属性和 methods 属性,组件中的 data 与 Vue 实例中的 data 用法不同。
Vue 实例中的 data 是一个对象,可以直接写数据,组件中的 data 是一个方法,并且必须返回一个对象。在 return 的对象中存储数据,组件中 methods 属性的使用方法和 Vue 实例中 methods 属性的使用方法是一样的,都是存储方法。
组件选项卡切换案例
本节制作组件选项卡切换案例,分为双组件切换和多组件切换。
双组件切换
视图层代码如下。
<div id="app" v-cloak>
<a @click="tab(1)">登录</a>
<a @click="tab(0)">注册</a>
<com1 v-if="flag"></com1>
<com2 v-else></com2>
</div>
Vue 实例代码如下。
<script>
var com1 = {
template: '<h1>login组件</h1>'
};
var com2 = {
template: '<h1>register组件</h1>'
};
var vm = new Vue({
el: '#app',
data: {
flag: true
},
methods: {
tab(i) {
if (i == 1) {
this.flag = true;
} else {
this.flag = false;
}
}
},
components: {
com1,
com2
}
});
</script>
代码解析如下。
-
此案例练习私有组件的创建,com1 和 com2 是两个私有组件。
-
使用 v-if 和 v-else 控制组件的显示和隐藏。
-
绑定单击事件,根据传递的参数控制 flag 属性的值。
多组件切换
使用 v-if 和 v-else 只能实现两个组件之间的切换,使用 <component> 标签可以实现多组件切换,代码如下。
视图层代码如下。
<div id="app" v-cloak>
<a @click="tab('com1')">登录</a>
<a @click="tab('com2')">注册</a>
<a @click="tab('com3')">首页</a>
<!-- 组件的名称是字符串,需要使用引号 -->
<component :is="comName"></component>
</div>
<script>
var com1 = {
template: '<h1>login组件</h1>'
};
var com2 = {
template: '<h1>register组件</h1>'
};
var com3 = {
template: '<h1>首页</h1>'
};
var vm = new Vue({
el: '#app',
data: {
comName: 'com1'
},
methods: {
tab(i) {
this.comName = i;
}
},
components: {
com1,
com2,
com3
}
});
</script>
代码解析如下。
-
练习私有组件创建(com1、com2、com3)。
-
把组件放到 component 标签,绑定 is 属性,is 属性的值是哪个组件,页面就会显示哪个组件。
-
添加单击事件,把组件名字传递给 comName 变量。