插槽就是子组件提供给父组件使用的一个占位符,用 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的标签。
想要在一个组件标签中,加入一些内容,那就必须要在组件内声明slot元素,否则不会被渲染出来
子组件
<template>
<div>
<h1>今天天气状况:</h1>
<slot></slot>
</div>
</template>
<script>
export default {
name: 'child'
}
</script>
父组件
<template>
<div>
<div>使用slot分发内容</div>
<div>
<child>
<div style="margin-top: 30px">多云,最高气温34度,最低气温28度,微风</div>
</child>
</div>
</div>
</template>
<script>
import child from "./child.vue";
export default {
name: 'father',
components:{
child
}
}
</script>
具名插槽
子组件
<template>
<div>
<div class="header">
<h1>我是页头标题</h1>
<div>
<slot name="header"></slot>
</div>
</div>
<div class="footer">
<h1>我是页尾标题</h1>
<div>
<slot name="footer"></slot>
</div>
</div>
</div>
</template>
<script>
export default {
name: "child1"
}
</script>
<style scoped>
</style>
父组件
<template>
<div>
<div>slot内容分发</div>
<child1>
<template slot="header">
<p>我是页头的具体内容</p>
</template>
<template slot="footer">
<p>我是页尾的具体内容</p>
</template>
</child1>
</div>
</template>
<script>
import child1 from "./child1.vue";
export default {
name: "father1",
components: {
child1
}
}
</script>
<style scoped>
</style>
作用域插槽
作用域插槽其实就是带数据的插槽,简单点说就是子组件提供给父组件的数据,父组件可根据子组件传过来的插槽数据来进行不同的方式展现和填充插槽内容。
子组件slot元素未设置name属性,所以就是默认插槽,因此’v-slot:default="slotProps"可以缩写为v-slot="slotProps",但是缩写语法不能和具名插槽混用,否则会导致作用域不明确。
//子组件 : (假设名为:ebutton)
<template>
<div class= 'button'>
<button> </button>
<slot name= 'one' :value1='child1' :value2='child2'> 这就是默认值1</slot> //绑定child1的数据
<slot :value2='child2'> 这就是默认值2 </slot> //绑定child2的数据,这里我没有命名slot
</div>
</template>
new Vue({
el:'.button',
data:{
child1:'数据1',
child2:'数据2'
}
})
//父组件:(引用子组件 ebutton)
<template>
<div class= 'app'>
<ebutton>
<template v-slot:one = 'slotone'>
{{ slotone.value1 }} // 通过v-slot的语法 将子组件的value1值赋值给slotone
</template>
<template v-slot:default = 'slottwo'>
{{ slottwo.value2 }} // 同上,由于子组件没有给slot命名,默认值就为default
</template>
</ebutton>
</div>
</template>
v2.6 v-slot:header 可以被重写为 #header
<template>
<div class= 'app'>
<ebutton>
<template #one = '{value1,value2}'>
{{ value1 }}
</template>
<template #default = '{value2}'>
{{ value2 }}
</template>
</ebutton>
</div>
</template>