# μ¬λ‘―
μ¬λ‘―(slot)μ μ»΄ν¬λνΈμ μ¬μ¬μ©μ±μ λμ¬μ£Όλ κΈ°λ₯μ λλ€. νΉμ μ»΄ν¬λνΈμ λ±λ‘ν νμ μ»΄ν¬λνΈμ λ§ν¬μ μ νμ₯νκ±°λ μ¬μ μν μ μμ΅λλ€.
# μ¬λ‘― μ½λ νμ
μ¬λ‘―μ λ¬Έλ²μ λ°λ‘ μ½λλ‘ μ΄ν΄λ³΄κ² μ΅λλ€.
<!-- ButtonTab.vue -->
<template>
<div class="tab panel">
<!-- ν ν€λ -->
<slot></slot>
<!-- ν λ³Έλ¬Έ -->
<div class="content">
Tab Contents
</div>
</div>
</template>
μ μ½λλ ButtonTab μ»΄ν¬λνΈμ μ½λμ
λλ€. νμ ꡬννλ€κ³ μκ°νκ³ ν ν€λμ λ³Έλ¬Έμ ꡬλΆνλ νκ·Έλ₯Ό μμ±νμμ΅λλ€. μ¬κΈ°μ ν ν€λμ λ€μ΄κ° ꡬ체μ μΈ νκ·Έλ₯Ό μ νμ§ μκ³ μΌλ¨ <slot>
νκ·Έλ‘ λΉ μΉΈμ λ¨κ²¨λλλ€. λ§μ½ μ΄ μ»΄ν¬λνΈλ₯Ό λ±λ‘ν μμ μ»΄ν¬λνΈμμ <slot>
νκ·Έ μμμ ꡬννμ§ μμΌλ©΄ ν΄λΉ λΆλΆμ 곡백μΌλ‘ νμλ©λλ€.
<slot>
νκ·Έμ μμΉμ μ£Όλͺ©νλ©΄μ ButtonTab μ»΄ν¬λνΈλ₯Ό TabContainer μ»΄ν¬λνΈμ νμ μ»΄ν¬λνΈλ‘ λ±λ‘ν©λλ€.
<!-- TabContainer.vue -->
<template>
<button-tab>
<!-- slot μμ -->
<h1>First Header</h1>
</button-tab>
<button-tab>
<!-- slot μμ -->
<h1>Second Header</h1>
</button-tab>
<button-tab>
<!-- slot μμ -->
<h1>Third Header</h1>
</button-tab>
</template>
<script>
export default {
components: {
ButtonTab
}
}
</script>
TabContainer μ»΄ν¬λνΈμ ButtonTab μ»΄ν¬λνΈλ₯Ό λ±λ‘νκ³ ButtonTab μ»΄ν¬λνΈλ₯Ό μΈ κ³³μ νμνμ΅λλ€. μ¬κΈ°μ <button-tab>
μ»΄ν¬λνΈ νκ·Έμ μμ κ°κΈ° λ€λ₯Έ ν€λμ λ΄μ©μ μ μνμ΅λλ€. λ§μ½ ButtonTab μ»΄ν¬λνΈμ <slot>
νκ·Έλ₯Ό μ μνμ§ μμλ€λ©΄ μ»΄ν¬λνΈλ₯Ό λ±λ‘νλ μμ μ λ§ν¬μ
μ μ¬μ μν μλ μμμ κ²μ
λλ€.
μ΄μ²λΌ μ¬λ‘―μ μ¬μ©νλ©΄ μ»΄ν¬λνΈμ νΉμ λ§ν¬μ μμμ μ¬μ μνμ¬ κ°μ μ»΄ν¬λνΈλ₯Ό κ°κΈ° λ€λ₯΄κ² ννν μ μμ΅λλ€.
# Named Slots
μμμλ μ¬λ‘―μ κ°λ μ μ΄ν΄νκΈ° μν΄ 1κ°μ μ¬λ‘―λ§ μ¬μ©νμ΅λλ€. μ¬λ‘―μ name μμ±μ μ§μ νμ¬ μ¬λ¬ κ° μ¬μ©ν μλ μμ΅λλ€. μ’ μ μμ μ λ€μλ μ¬λ‘―μ μ μ©ν΄λ³΄κ² μ΅λλ€.
<!-- ButtonTab.vue -->
<template>
<div class="tab panel">
<!-- ν ν€λ -->
<slot name="header"></slot>
<!-- ν λ³Έλ¬Έ -->
<slot name="content"></slot>
</div>
</template>
<!-- TabContainer.vue -->
<template>
<button-tab>
<!-- slot μμ -->
<h1 slot="header">First Header</h1>
<div slot="content" class="content">Tab Contents #1</div>
</button-tab>
<button-tab>
<!-- slot μμ -->
<h1 slot="header">Second Header</h1>
<div slot="content" class="content">Tab Contents #2</div>
</button-tab>
<button-tab>
<!-- slot μμ -->
<h1 slot="header">Third Header</h1>
<div slot="content" class="content">Tab Contents #3</div>
</button-tab>
</template>
..
νμ μ»΄ν¬λνΈμμ μ μν μ¬λ‘― νκ·Έ μμμ λ§ν¬μ
μ μ¬μ μν λ μμ κ°μ΄ HTML νμ€ νκ·Έλ₯Ό μ¬μ©νλ λ°©λ²λ μμ§λ§ μλμ κ°μ΄ <template>
νκ·Έλ₯Ό μ¬μ©ν μλ μμ΅λλ€.
<button-tab>
<!-- slot μμ -->
<template slot="header">
<h1>First Header</h1>
</template>
<template slot="content">
<div class="content">Tab Contents #1</div>
</template>
</button-tab>
# μ°Έκ³
Vue.js 2.6 λ²μ λΆν° Named Slots λ¬Έλ²μ΄ λ°λμμ΅λλ€.
<!-- κΈ°μ‘΄(2.5 μ΄ν) -->
<template slot="header">
<h1>First Header</h1>
</template>
<!-- μ΄ν(2.6 μ΄μ) -->
<!-- 1. νλ€μ -->
<template v-slot:header>
<h1>First Header</h1>
</template>
<!-- 2. μ½μ λ¬Έλ² -->
<template #header>
<h1>First Header</h1>
</template>
λ μμΈν λ΄μ©μ μ¬κΈ° (opens new window)λ₯Ό μ°Έκ³ νμΈμ.
β Composition API π Scoped Slot β