1. Slot คืออะไร?
Slot ใน Vue.js คือพื้นที่ว่างใน Component ที่สามารถใส่เนื้อหา (Content) จากภายนอกได้ ทำให้ Component มีความยืดหยุ่นและสามารถปรับแต่งเนื้อหาได้ตามต้องการ
2. การใช้ Slot เบื้องต้น
ตัวอย่าง:
<template>
<div class="card">
<header class="card-header">
<slot name="header">Default Header</slot>
</header>
<main class="card-content">
<slot>Default Content</slot>
</main>
<footer class="card-footer">
<slot name="footer">Default Footer</slot>
</footer>
</div>
</template>
<script>
export default {
name: 'Card'
};
</script>
<style>
.card {
border: 1px solid #ccc;
border-radius: 5px;
padding: 10px;
margin: 10px 0;
}
.card-header, .card-footer {
background-color: #f9f9f9;
padding: 5px;
font-weight: bold;
}
.card-content {
padding: 10px;
}
</style>
การใช้งาน Component พร้อม Slot:
<template>
<div>
<Card>
<template #header>
<h1>Custom Header</h1>
</template>
<template>
<p>This is custom content inside the card.</p>
</template>
<template #footer>
<p>Custom Footer</p>
</template>
</Card>
</div>
</template>
<script>
import Card from './Card.vue';
export default {
components: {
Card
}
};
</script>
คำอธิบาย:
- ใช้
<slot>
ใน Component เพื่อกำหนดพื้นที่สำหรับเนื้อหาภายนอก - สามารถระบุชื่อ Slot ด้วย
name
และใช้#slot-name
ในการส่งเนื้อหาไปยัง Slot นั้น
3. Default Slot
Default Slot คือ Slot ที่ไม่ระบุชื่อ และใช้สำหรับใส่เนื้อหาหลักใน Component
ตัวอย่าง:
<template>
<div class="message">
<slot>Default message content.</slot>
</div>
</template>
<script>
export default {
name: 'Message'
};
</script>
<style>
.message {
border: 1px solid #007bff;
background-color: #cce5ff;
padding: 10px;
border-radius: 5px;
color: #004085;
}
</style>
การใช้งาน:
<template>
<div>
<Message>
Custom message content goes here.
</Message>
</div>
</template>
<script>
import Message from './Message.vue';
export default {
components: {
Message
}
};
</script>
ผลลัพธ์:
ถ้าไม่มีเนื้อหาภายนอกใส่ใน <Message>
จะใช้ “Default message content.”
4. Named Slot
Named Slot ใช้เมื่อ Component มีหลาย Slot และต้องการแยกเนื้อหาสำหรับแต่ละส่วน
ตัวอย่าง:
<template>
<div class="layout">
<header>
<slot name="header">Default Header</slot>
</header>
<main>
<slot>Main Content</slot>
</main>
<footer>
<slot name="footer">Default Footer</slot>
</footer>
</div>
</template>
<script>
export default {
name: 'Layout'
};
</script>
<style>
.layout {
border: 1px solid #ddd;
padding: 10px;
}
header, footer {
background-color: #f0f0f0;
padding: 5px;
text-align: center;
}
main {
padding: 10px;
}
</style>
การใช้งาน:
<template>
<Layout>
<template #header>
<h1>My Custom Header</h1>
</template>
<p>This is the main content area.</p>
<template #footer>
<p>My Custom Footer</p>
</template>
</Layout>
</template>
<script>
import Layout from './Layout.vue';
export default {
components: {
Layout
}
};
</script>
5. Scoped Slot
Scoped Slot ใช้สำหรับส่งข้อมูลจาก Component ไปยัง Slot เพื่อให้เนื้อหาภายนอกสามารถใช้ข้อมูลภายใน Component ได้
ตัวอย่าง:
<template>
<div>
<slot :items="items"></slot>
</div>
</template>
<script>
export default {
data() {
return {
items: ['Item 1', 'Item 2', 'Item 3']
};
}
};
</script>
การใช้งาน:
<template>
<CustomList v-slot="{ items }">
<ul>
<li v-for="item in items" :key="item">{{ item }}</li>
</ul>
</CustomList>
</template>
<script>
import CustomList from './CustomList.vue';
export default {
components: {
CustomList
}
};
</script>
คำอธิบาย:
- ใช้
v-slot
เพื่อดึงข้อมูลจาก Scoped Slot และแสดงในเนื้อหาภายนอก
6. สรุป
ในบทนี้ คุณได้เรียนรู้เกี่ยวกับ:
- การใช้งาน Slot เพื่อเพิ่มความยืดหยุ่นให้กับ Component
- Default Slot และ Named Slot สำหรับการจัดการเนื้อหา
- Scoped Slot เพื่อส่งข้อมูลจาก Component ไปยังเนื้อหาภายนอก
ในบทถัดไป เราจะศึกษาการสร้าง Component ที่ซับซ้อนและการจัดการ Dependency ระหว่าง Component!