vue3插槽变化
1.默认插槽还是跟以前一样
2.使用具名插槽时,子组件不变
以前的父组件掉用的时候
<template slot="example">
</template>
现在为
<template v-slot:example>
</template>
或者
<template #example>
</template>
3.作用域插槽
①父组件写法 v-slot=“{子组件插槽定义的值}”,多个值写法v-slot=“{ data,index }”,同时这里也可以简写
#default=“{ data,index }” 这样就可以了
<template>
<div class="home_main">
<Dialog>
<template #header>
<div>
我是头部的内容
</div>
</template>
<template v-slot="{ data,index }">
<div>
{{ data.name }}--{{ data.age }}--{{index}}
</div>
</template>
<template #footer>
<div>
我是底部内容
</div>
</template>
</Dialog>
</div>
</template>
<script lang="ts" setup>
import Dialog from "../../components/slotDialog/index.vue"
</script>
<style lang="scss">
.home_main {
width: 100%;
height: 100vh;
background: green;
font-size: 30px;
}
</style>
②子组件写法可以传多个值
<template>
<div class="dialog_main">
<header class="header">
<slot name="header"></slot>
</header>
<main class="main">
<div v-for="(item, index) in dataList" :key="index">
<slot :data="item" :index="index"></slot>
</div>
</main>
<footer class="footer">
<slot name="footer"></slot>
</footer>
</div>
</template>
<script lang='ts' setup>
import { reactive } from "vue";
type names = {
name: string,
age: number
}
const dataList = reactive<names[]>([{
name: '小林',
age: 26
},
{
name: '小王',
age: 27
}, {
name: '小李',
age: 28
}, {
name: '小石',
age: 29
}, {
name: '小林',
age: 26
}])
</script>
<style scoped lang="scss">
.dialog_main {
.header {
height: 20vh;
background: red;
width: 100%;
}
.main {
height: 50vh;
width: 100%;
background: yellow;
}
.footer {
height: 30vh;
width: 100%;
background: blue;
}
}
</style>

若多个作用域插槽,则是具名+作用域
<template>
<div>
<!-- 默认插槽 -->
<slot></slot>
<!-- 作用域插槽 1 -->
<slot name="header" :headerData="headerData"></slot>
<!-- 作用域插槽 2 -->
<slot name="footer" :footerData="footerData"></slot>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const headerData = ref('这是头部数据');
const footerData = ref('这是底部数据');
</script>
<template>
<ChildComponent>
<!-- 默认插槽 -->
<template v-slot:default>
<p>这是默认插槽内容</p>
</template>
<!-- 作用域插槽 1 -->
<template v-slot:header="{ headerData }">
<h1>{{ headerData }}</h1>
</template>
<!-- 作用域插槽 2 -->
<template v-slot:footer="{ footerData }">
<footer>{{ footerData }}</footer>
</template>
</ChildComponent>
</template>
<script setup lang="ts">
import ChildComponent from './ChildComponent.vue';
</script>
动态插槽(父组件中使用,通过变量)
<Dialog>
<template #[name]>
<div>
23
</div>
</template>
</Dialog>
const name = ref('header')
浙公网安备 33010602011771号