【vue3】匿名插槽,具名插槽,作用域插槽,动态插槽
注意!
匿名插槽有name值,为default
- 匿名插槽有name值,为default
- 作用域插槽—可以把子组件的值传给父组件使用
- v-slot: 可以简写成 #
//父级
<template>
<Com9>
<template v-slot>
这里是匿名插槽
</template>
<template #header>
这里是具名插槽-header
</template>
<template v-slot:footer>
这里是具名插槽-footer
</template>
<template v-slot:namespace="{list,test}">
<p v-for="(item, index) in list" :key="index">
这是作用域插槽---{{ item?.name }}---{{ test }}
</p>
</template>
<template #[slotName]>
<p>这里是动态插槽---{{ slotName }}</p>
</template>
</Com9>
<button @click="changeSlot('header')">插入header</button>
<button @click="changeSlot('default')">插入main</button>
<button @click="changeSlot('footer')">插入footer</button>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
import Com9 from '../components/MySlot.vue'
let slotName = ref<string>('header')
const changeSlot = (string:string) =>{
slotName.value = string
}
</script>
<style scoped lang='scss'>
</style>
//子集
<template>
<div class="header">
<slot name="header"></slot>
</div>
<div class="main">
<slot></slot>
<!-- 作用域插槽 -->
<slot :list="person" :test="'test'" name="namespace"></slot>
</div>
<div class="footer">
<slot name="footer"></slot>
</div>
</template>
<script setup lang='ts'>
import { reactive } from 'vue'
type tobj = {
name:string,
age:number
}
const person = reactive<tobj []>([
{
name:'张三',
age:12
},
{
name:'李四',
age:18
},
{
name:'小明',
age:18
},
{
name:'小红',
age:18
}
])
</script>
<style scoped lang='scss'>
.header{
width: 400px;
min-height: 100px;
background-color: red;
padding: 16px;
}
.main{
width: 400px;
min-height: 100px;
background-color: rgb(0, 174, 255);
padding: 16px;
}
.footer{
width: 400px;
min-height: 100px;
background-color: rgb(255, 196, 0);
padding: 16px;
}
</style>