Dev to webs {Coding…}

เรียนรู้การพัฒนาซอฟเวอร์ เพื่อความรู้ที่ยั่งยืน

บทที่ 18: การใช้ Slot เพื่อสร้าง Component ที่ยืดหยุ่นและปรับแต่งได้

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!