[Vue] 元件-Slot
TL;DR
參考資料
相關連結
Slot簡介
在元件中可以在template
中插入slot
插槽,提供給外層的元件將片段插入插槽中。
使用方法
- html(#app)
- vue
<div id="app">
<div class="p-5">
<h3>Slot 插巢與插巢預設值</h3>
<card>
<i>插入slot插槽</i>
</card>
<br>
<!-- 沒有填入slot內容的插槽,會帶入vue.js中<slot>內的預設值 -->
<card></card>
</div>
</div>
const app = Vue.createApp({
});
app.component('card', {
template: `<div class="card" style="width: 18rem;">
<div class="card-header">
元件 Header
</div>
<div class="card-body">
<slot>這段是預設的文字</slot>
</div>
<div class="card-footer">
元件 Footer
</div>
</div>`
})
app.mount('#app');
如果子元件template
內只有一個slot
,則可以直接在掛載元件內插入內容,會自動帶入插槽中。
也可以在子元件template
內的slot
中撰寫預設值,掛載元件沒有插入slot
內容時,則會顯示子元件template
的slot
內的預設值。
具名插槽
使用具名插槽時需要搭配 template
標籤使用
當 子元件 template
內有多個slot
時,就需要透過name
屬性給予每個slot
名字。(<slot name="slotName"></slot>
)
並且在使用時填入<template v-slot:slotName>
來指定要帶入哪個插槽。 (需要使用template
標籤才 可以正確使用v-slot
指令)
沒有指定name
的插槽則需要使用v-slot:default
去將內容插入該插槽。
- html(#app)
- vue
<div id="app">
<div class="p-5">
<h3>具名插巢</h3>
<card2>
<template v-slot:header>我喜歡這張卡片</template>
<!-- 預設請加入 default -->
<template #default>這是卡片 2 號</template>
<template v-slot:footer>這是卡片腳</template>
</card2>
<h3 class="mt-3">具名插巢縮寫</h3>
<card2>
<template #header>我喜歡這張卡片</template>
<template #default>這是卡片 2 號</template>
<template #footer>這是卡片腳</template>
</card2>
</div>
</div>
const app = Vue.createApp({
});
app.component('card2', {
template: `<div class="card" style="width: 18rem;">
<div class="card-header">
<slot name="header">元件 Header</slot>
</div>
<div class="card-body">
<slot>這段是預設的文字</slot>
</div>
<div class="card-footer">
<slot name="footer">元件 Footer</slot>
</div>
</div>`
});
app.mount('#app');
具名插槽縮寫
在指定帶入插槽的名稱時,可以使用#
縮寫
e.g: v-slot:header
與 #header
是等價的。
指定多個default
- html(#app)
- vue
<div id="app">
<div class="p-5">
<h3>多元件指定相同插槽</h3>
<card2>
<template v-slot:header>我喜歡這張卡片</template>
<!-- 同時指定兩個相同插槽時,以第一個指定的為主 -->
<template #default>這是卡片 2 號</template>
<template #default>這是卡片 二 號</template>
</card2>
</div>
</div>
const app = Vue.createApp({
});
app.component('card2', {
template: `<div class="card" style="width: 18rem;">
<div class="card-header">
<slot name="header">元件 Header</slot>
</div>
<div class="card-body">
<slot>這段是預設的文字</slot>
</div>
<div class="card-footer">
<slot name="footer">元件 Footer 預設文字</slot>
</div>
</div>`
});
app.mount('#app');
具有多個相同名 稱插槽
當具有多個相同名稱的插槽,或具有多個未命名插槽。則同名插槽所帶入的內容都會完全相同。
- html(#app)
- vue
<div id="app">
<div class="p-5">
<h3>具有多個同名插槽</h3>
<card2>
<template v-slot:header>我喜歡這張卡片</template>
<template #default>這是卡片 2 號</template>
<!-- footer沒有指定,會帶入預設值 -->
</card2>
</div>
</div>
const app = Vue.createApp({
});
app.component('card2', {
template: `<div class="card" style="width: 18rem;">
<div class="card-header">
<slot name="header">元件 Header</slot>
</div>
<div class="card-header">
<slot name="header">元件 Header</slot>
</div>
<div class="card-body">
<slot>這段是預設的文字</slot>
</div>
<div class="card-body">
<slot>這段是預設的文字</slot>
</div>
<div class="card-footer">
<slot name="footer">元件 Footer 預設文字</slot>
</div>
<div class="card-footer">
<slot name="footer">