默认插槽:
这是最基本的插槽类型,当没有指定 name
属性时,插槽是默认插槽。
子组件:
<template>
<div class="child">
<h2>子组件内容</h2>
<slot></slot> <!-- 默认插槽,插入父组件传递的内容 -->
</div>
</template>
父组件:
<template>
<ChildComponent>
<p>这是插入到默认插槽的内容</p>
</ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: { ChildComponent }
};
</script>
具名插槽:
具名插槽允许在组件中定义多个插槽,并在父组件中指定每个插槽的内容。
- 子组件
ChildComponent
定义了两个具名插槽:header
和footer
。 - 父组件通过
<template #header>
和<template #footer>
向这些具名插槽传递内容。
子组件:
<template>
<div class="child">
<h2>子组件内容</h2>
<slot name="header"></slot> <!-- 具名插槽 "header" -->
<slot name="footer"></slot> <!-- 具名插槽 "footer" -->
</div>
</template>
父组件:
<template>
<ChildComponent>
<template #header>
<h3>这是插入到 header 插槽的内容</h3>
</template>
<template #footer>
<p>这是插入到 footer 插槽的内容</p>
</template>
</ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: { ChildComponent }
};
</script>
作用域插槽:
作用域插槽允许子组件将数据传递给父组件,并由父组件决定如何渲染这些数据。
- 子组件
ChildComponent
使用作用域插槽向父组件传递user
数据。 - 父组件通过解构
{ user }
接收并使用这些数据来渲染内容。
子组件:
<template>
<div class="child">
<slot :user="user"></slot> <!-- 作用域插槽,传递 `user` 数据 -->
</div>
</template>
<script>
export default {
data() {
return {
user: { name: 'Alice', age: 25 }
};
}
};
</script>
父组件:
<template>
<ChildComponent>
<template #default="{ user }"> <!-- 接收子组件传递的 `user` 数据 -->
<p>用户名: {{ user.name }}</p>
<p>用户年龄: {{ user.age }}</p>
</template>
</ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: { ChildComponent }
};
</script>
动态插槽名:
动态插槽名允许根据运行时条件来决定使用哪个插槽。
- 子组件
ChildComponent
接收一个dynamicSlot
属性,动态决定使用哪个插槽。 - 父组件可以通过改变
currentSlot
的值来切换显示的内容。
子组件:
<template>
<div class="child">
<slot :name="dynamicSlot"></slot> <!-- 动态插槽名 -->
</div>
</template>
<script>
export default {
props: ['dynamicSlot']
};
</script>
父组件:
<template>
<ChildComponent :dynamicSlot="currentSlot">
<template #slot1>
<p>这是 slot1 的内容</p>
</template>
<template #slot2>
<p>这是 slot2 的内容</p>
</template>
</ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: { ChildComponent },
data() {
return {
currentSlot: 'slot1' // 可以根据条件变更为 'slot2'
};
}
};
</script>
插槽默认类容:
如果父组件不提供内容,插槽可以显示默认内容。
- 如果父组件没有向
ChildComponent
的默认插槽传递任何内容,那么子组件将显示默认内容 “这是插槽的默认内容”。
子组件:
<template>
<div class="child">
<slot>这是插槽的默认内容</slot> <!-- 默认内容 -->
</div>
</template>
父组件:
<template>
<ChildComponent>
<!-- 没有插入任何内容时,显示子组件定义的默认内容 -->
</ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: { ChildComponent }
};
</script>