目录
4.1Vue组件的介绍
Vue提供灵活的组件系统。使用Vue组件可以将可复用的小组件
|构建成大型应用。Vue组件中可以自定义标签,并拥有自身的模板、
样式和交互。
1. Vue组件介绍
2. Vue组件的使用
3. 组件之间的通信
4. Vue的插槽
Vue组件的介绍
组件系统是Vue中一个重要的概念,它提供了一种抽象,可以使
用独立和可复用的小组件来构建大型应用,任意类型的应用界面都可
以抽象为一个组件树。
组件是可复用的Vue实例且带有一个名字。组件可以扩展HTML
元素,封装可重用的HTML代码,可将组件看作自定义的HTML元素
Vue组件的使用
注册组件过程又细分为全局注册和局部注册。
1.全局注册
全局注册就是调用Vue.component()注册组件,全局注册的组件可以在
当前页面的任意Vue实例下使用。
2.局部注册
如果不需要全局注册,或者是让组件在其他组件内使用,可以在Vue实
例化时,设置选项参数的components参数属性实现局部注册。
全局组件的案例
<div id="app1">
<h1>Vue实例1</h1>
<my-comp></my-comp>
</div>
<div id="app2">
<h1>Vue实例2</h1>
<my-comp></my-comp>
</div>
<script src="/js/vue.min.js"></script>
<script>
//创建组件
var myComp = Vue.extend({
template: "<h1>使用vue全局组件</h1>"
})
//注册组件
Vue.component("my-comp", myComp);
var vm = new Vue({
el: "#app1"
})
var vm = new Vue({
el: "#app2"
})
</script>
局部组件的案例
<div id="app1">
<h1>Vue实例1</h1>
<my-comp></my-comp>
</div>
<div id="app2">
<h1>Vue实例2</h1>
<my-comp></my-comp>
</div>
<script src="/js/vue.min.js"></script>
<script>
//创建组件
var myComp = Vue.extend({
template: "<h1>使用vue全局组件</h1>"
})
var vm = new Vue({
el: "#app1",
//注册组件
components: {
"my-comp": myComp
}
})
var vm = new Vue({
el: "#app2"
})
</script>
4.2Vue组件的使用
3.组件注册语法
Vue.js为了简化这个过程,提供了注册语法糖,即在注册组件时直接创
建和注册组件,Vue在背后会自动地调用Vue.extend()。
(1 )简化全局注册:
11全局注册,my-comp是组件标签名称
//全局注册组件
Vue.component("my-comp", myComp);
(2)简化局部注册
var vm = new Vue({
el: "#app1",
//局部注册组件
components: {
"my-comp": myComp
}
})
自定义组件模板案例
<div id="app1">
<h1>Vue实例1</h1>
<my-comp></my-comp>
</div>
<div id="app2">
<h1>Vue实例2</h1>
<my-comp></my-comp>
</div>
<!-- //自定义组件 -->
<template id="myComp">
<h1>使用template标签自定义组件模板</h1>
</template>
<script src="/js/vue.min.js"></script>
<script>
var vm = new Vue({
el: "#app1",
//局部注册组件
components: {
"my-comp": {
template: "#myComp"
}
}
})
var vm = new Vue({
el: "#app2",
//局部注册组件
components: {
"my-comp": {
template: "#myComp"
}
}
})
</script>
4.组件的data和el选项:
一般实例化Vue的多 数选项也可以用在Vue.extend()或Vue.component()
中的,不过有两个特殊选项参数除外,即data和el。
”Vue.js规定: 在定义组件的选项时, data和el选项必须使用函数。
如果data选项指向某个对象,这意味着所有的组件实例共用一个data。
使用一个函数作为data选项,让这个函数返回一个新对象。
自定义组件传值案例
<div id="app1">
<!-- 使用控件 -->
<fruit-list-comp></fruit-list-comp>
</div>
<!-- //自定义组件 -->
<template id="myFuit">
<div>
<ul>
<li v-for="fruit in fruitList">{{fruit}}</li>
</ul>
</div>
</template>
<script src="/js/vue.min.js"></script>
<script>
var vm = new Vue({
el: "#app1",
//局部注册组件
components: {
"fruit-list-comp": {
data: function() {
return {
fruitList: [
"火龙果",
"刺角瓜",
"莲雾",
"佛手湖"
]
}
},
template: "#myFuit"
}
}
})
</script>
4.3组件之间的通信
1.父组件和子组件:
可以在组件中定义并使用其他组件,这就构成了父子组件的关系,子组
件是在父组件中注册的,只能在父组件中使用,确切地说,子组件只能在父
组件的template中使用。
请注意下面两种子组件的使用方式是错误的:
(1)以子标签的形式在父组件中使用。
(2)在父组件标签外使用子组件。
父内调用子控件
<div id="app1">
<!-- 使用控件 -->
<parent-comp></parent-comp>
</div>
<script src="/js/vue.min.js"></script>
<script>
// 创建子组件
var child = Vue.extend({
template: "<p>这是子组件</p>"
});
// 创建子组件
var parent = Vue.extend({
template: "<p>这是父组件<child-comp></child-comp></p>",
components: {
"child-comp": child
}
});
//注册父组件
Vue.component("parent-comp", parent)
var vm = new Vue({
el: '#app1'
})
</script>
2.通过props向子组件传递数据:
组件实例的作用域是孤立的,这意味着不能并且不应该在子组件的模板
内直接引用父组件的数据,可以使用props把数据传给子组件。
-一个组件默认可以拥有任意数量的props (属性) ,任何值都可以传递 |
给任何props。在组件中,使用选项props来声明需要从父组件中接收的数据
props的值可以是两种:一种是字符串数组;另一种是对象。
语法1
components:{
"控件名":{
props:["值名","isStyle"],
template:"父组件名",
}
}
语法2
components:{
"控件名":{
props:{
值名:string //类型
}
template:"父组件名",
}
}
<div id="app">
<!-- 使用父组件 -->
<banner-component message="消夏玩一夏!" v-bind:is-style="isShowStyle"></banner-component>
</div>
<!-- 创建子组件 -->
<template id="childComp">
<span>{{ subMessage}}</span>
</template>
<!-- 创建父组件 -->
<template id="parentComp">
<div>
<h1 :class="{banner:isStyle}">
{{message}}
<!-- 使用子组件 -->
<child-compontent sub-message="不玩就out啦!"></child-compontent>
</h1>
</div>
</template>
<script src="/js/vue.min.js"></script>
<script>
var vm = new Vue({
el: "#app",
data: {
isShowStyle: true
},
// 注册父组件
components: {
"banner-component": {
props: ["message", "isStyle"], //数组语法
template: "#parentComp",
// 注册子组件
components: {
"child-compontent": {
props: {
subMessage: String //声明对象语法
},
template: "#childComp"
}
}
}
}
});
</script>
4.4Vue的插槽
插槽( Slot)是Vue提出来的一个概念,正如名字一样,用于将
所携带的内容插入到指定的某个位置,从而使模板分块,具有模块化
的特质和更大的重用性。
插槽显不显示、怎样显示是由父组件来控制的,而插槽在哪里显
示就由子组件来进行控制。
通过定义一个或多个<slot>标签,可将外部标记引入到组件的虚
拟DOM中进行渲染,相当于“在此处渲染用户的标记”
插槽有两种使用方式:默认插槽和具名插槽。
下面是插槽的案例
<div id="app">
<p-comp>
<!-- 具名插槽使用 -->
<template slot="header">
<h1>管理</h1>
</template>
<!-- 默认插槽使用 -->
默认插槽
<!-- 具名插槽使用 -->
<template slot="footer">
<h2>版权声明</h2>
</template>
</p-comp>
</div>
<!-- 创建组件 -->
<template id="pComp">
<div>
<!-- 具名插槽 -->
<slot name="header"></slot>
<!-- 默认插槽 -->
<slot></slot>
<!-- 具名插槽 -->
<slot name="footer"></slot>
</div>
</template>
<script src="/js/vue.min.js"></script>
<script>
var vm = new Vue({
el: "#app",
// 注册组件
components: {
"p-comp": {
template: "#pComp"
}
}
});
</script>
作用域插槽的使用
插槽可以控制HTML模板的显示与不显示。
作用域插槽( slot-scope )其实就是带数据的插槽。原来父组件
可以通过绑定数据传递给子组件,而作用域插槽可以通过子组件绑定
数据传递给父组件。
作用域插槽的使用场景:既可以复用子组件的slot,又可以使slot
内容不一 致。
作用域插槽案例,有些绕慢慢理解
<div id="app">
<book-list :books="bookList">
<template slot="book" slot-scope="props">
<li>{{props.bookname}}</li>
</template>
</book-list>
</div>
<!-- 创建组件 -->
<template id="bookComp">
<div>
<ul>
<slot name="book" v-for="book in books" :bookname="book.name"></slot>
</ul>
</div>
</template>
<script src="/js/vue.min.js"></script>
<script>
var vm = new Vue({
el: "#app",
data: {
bookList: [{
name: "vue实战"
}, {
name: "123456"
}, {
name: "ASP.NET"
}]
},
// 注册组件
components: {
"book-list": {
props: ["books"],
template: "#bookComp"
}
}
});
</script>