为什么用插槽?
使得我们的组件具有扩展性,由使用者决定组件内部展示的内容。将不同的地方定义为插槽暴露出去,根据使用的场景需求决定内容。
具名插槽?
有时候我们在一个组件需要用到多个插槽,用命名name="footer"的方式给每个插槽取名,可以区分它们。
作用域插槽?
在子组件中动态绑定需要传入的数据,在父组件传入数据给子组件。
示例
父组件
<template>
<div>
<SlotDemo :title="title">
具名:在指定的位置输出我们的子元素,如下面的尾部元素插槽。
<br />作用域:主要作用是在书写插槽内容时可以获取到插槽作用域(父组件传不同的值给子组件)的值,例如对话框的标题。
<br />
<template #footer>
<el-button size="mini" type="primary" style="margin-right:5px">编辑</el-button>
<el-button size="mini" type="error">删除</el-button>
</template>
</SlotDemo>
</div>
</template>
<script>
import SlotDemo from '../../components/slot-demo.vue'
export default {
name: 'Home',
components: {
SlotDemo
},
data() {
return {
title: '熟悉具名插槽和作用域插槽'
}
}
}
</script>
<style></style>
子组件
<template>
<div class="wrapper">
<div class="dialog">
<div class="header center">
<slot name="header">
<span>
<strong>{{ title }}</strong>
</span>
<i class="el-icon-close" @click="close"></i>
</slot>
</div>
<div class="body">
<slot>请输入正文</slot>
</div>
<div class="footer">
<slot name="footer" v-if="$slots.footer">我是尾部元素</slot>
</div>
<div class="clear"></div>
</div>
</div>
</template>
<script>
export default {
name: 'slot-demo',
props: {
title: {
type: String,
default: ''
},
}
}
</script>
<style scoped lang="scss">
.wrapper {
color: #333;
width: 1280px;
margin: 0 auto;
background-color: aquamarine;
.dialog {
padding: 10px;
.header {
position: relative;
i {
cursor: pointer;
position: absolute;
top: 5px;
right: 10px;
}
}
.body {
height: 100px;
}
.footer {
float: right;
height: 30px;
}
.clear {
clear: both;
}
}
}
.center {
display: flex;
align-items: center;
justify-content: center;
}
</style>