# μ€μ½₯λ μ¬λ‘―
μ¬λ‘―(slot)μ΄ μ»΄ν¬λνΈ ν νλ¦Ώμ μ¬μ¬μ©μ±μ λλ €μ£ΌκΈ° μν κΈ°λ₯μ΄λΌλ©΄ μ€μ½₯λ μ¬λ‘―(Scoped slot)μ μ»΄ν¬λνΈ λ°μ΄ν°μ μ¬μ¬μ©μ±μ λμ¬μ£Όλ κΈ°λ₯μ λλ€. μΌλ°μ μΌλ‘ λ·°μμλ νλ‘μ€ μμ±μ΄λ μ΄λ²€νΈ λ°μκ³Ό κ°μ μ»΄ν¬λνΈ ν΅μ λ°©μμ μ μΈνκ³ λ λ€λ₯Έ μ»΄ν¬λνΈμ κ°μ μ°Έμ‘°ν μ μμ΅λλ€. νμ§λ§ μ€μ½₯λ μ¬λ‘―μ νμ μ»΄ν¬λνΈμ κ°μ μμ μ»΄ν¬λνΈμμ μ κ·Όνμ¬ μ¬μ©ν μ μμ΅λλ€.
# μ€μ½₯λ μ¬λ‘― μ½λ νμ
μ€μ½₯λ μ¬λ‘―μ μ¬μ©νκΈ° μν΄μλ κΈ°λ³Έμ μΌλ‘ μμ, νμ 2κ°μ μ»΄ν¬λνΈκ° νμνκ³ κ°κ°μ μ»΄ν¬λνΈμ μλμ κ°μ΄ ꡬνν΄μΌν©λλ€.
<!-- νμ μ»΄ν¬λνΈμ μ¬λ‘― νκ·Έ -->
<slot :μμ μ»΄ν¬λνΈλ‘ μ λ¬ν μμ± μ΄λ¦="νμ μ»΄ν¬λνΈμ λ°μ΄ν°"></slot>
λ¨Όμ νμ μ»΄ν¬λνΈμμ <slot>
νκ·Έλ₯Ό μ μνκ³ v-bind
λλ ν°λΈμ μ½μ λ¬Έλ²μΈ :
λ₯Ό μ΄μ©νμ¬ νμ μ»΄ν¬λνΈμ λ°μ΄ν°λ₯Ό μ°κ²°ν©λλ€. μ»΄ν¬λνΈ ν΅μ λ°©λ²μμ λ°°μ΄ νλ‘μ€ μμ± μ λ¬ λ°©λ²κ³Ό λΉμ·ν νμμ
λλ€.
μ΄μ μμ μ»΄ν¬λνΈμ μ½λλ₯Ό λ³΄κ² μ΅λλ€.
<!-- μμ μ»΄ν¬λνΈμ λ±λ‘λ νμ μ»΄ν¬λνΈ νκ·Έ λΆλΆ -->
<child-component>
<template slot-scope="μμμ λ³μ">
{{ μμμ λ³μ.μμ μ»΄ν¬λνΈλ‘ μ λ¬ν μμ± μ΄λ¦ }}
</template>
</child-component>
νμ μ»΄ν¬λνΈμΈ <child-component>
νκ·Έμ μ§μ€ν©λλ€. μμμ <slot>
νκ·Έλ₯Ό 미리 μ μν΄λ¨κΈ° λλ¬Έμ <child-component>
νκ·Έ μ¬μ΄μ λ€μ΄κ°λ μ½λλ λͺ¨λ μ¬λ‘―μΌλ‘ μ²λ¦¬κ° λ©λλ€. μ¬κΈ°μ slot-scope
λΌλ μμ±μΌλ‘ νμ μ»΄ν¬λνΈμμ μ¬λ €λ³΄λ΄μ€ λ°μ΄ν°λ₯Ό μ λ¬λ°μ μ μμ΅λλ€.
TIP
slot-scope
μμ±μ΄ μ μλ <template>
νκ·Έλ μ€μ DOMμ΄ μλλΌ μμ±μ μ λ¬λ°κΈ° μν κ»λ°κΈ°μΌ λΏμ
λλ€. μ€μ λ‘ νλ©΄ λ λλ§μ΄ λκ³ λλ©΄ <template>
νκ·Έλ κ°μμ μΈ νκ·Έλ‘ λ³νλμ§ μμ΅λλ€.
μμ§ μ μλΏμΌμ€ μ μμΌλ μ€μ μμ λ₯Ό κ°μ΄ μ΄ν΄λ³΄κ² μ΅λλ€.
# μ€μ½₯λ μ¬λ‘― μ½λ μμ
μμμ μ΄ν΄λ³Έ μ½λ νμμ μ°Έκ³ νμ¬ κ°λ¨ν μμ λ₯Ό μ μνμμ΅λλ€. μμ μ»΄ν¬λνΈλ App.vueμ΄κ³ νμ μ»΄ν¬λνΈλ ChildComponent.vue μ λλ€.
νμ μ»΄ν¬λνΈμ μ½λλΆν° λ³΄κ² μ΅λλ€.
<!-- ChildComponent.vue -->
<template>
<div>
<h1>Child Component</h1>
<slot :message="message"></slot>
</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello'
}
},
}
</script>
νμ μ»΄ν¬λνΈμ <slot>
νκ·Έλ₯Ό μ μνκ³ v-bind λλ ν°λΈ(:
)λ₯Ό μ΄μ©νμ¬ message
μμ±μ μ λ¬νμμ΅λλ€.
μ΄λ²μ μμ μ»΄ν¬λνΈμ μ½λλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
<!-- App.vue -->
<template>
<div>
<child-component>
<template slot-scope="scopeProps">
{{ scopeProps.message }}
</template>
</child-component>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
}
}
</script>
νμ μ»΄ν¬λνΈμΈ <child-component>
νκ·Έμ μ¬λ‘― μμμ slot-scope
μμ±μ μ μνμμ΅λλ€. μ¬κΈ°μ μ¬μ©ν λ³μ scopeProps
λ νμ μ»΄ν¬λνΈμμ μ¬λ €μ€ κ°μ λ°κΈ° μν μμμ λ³μμ
λλ€. μμμ λ³μμ΄κΈ° λλ¬Έμ μνλ λ³μ λͺ
μ μ§μ νμ¬ μ¬μ©ν μ μμ΅λλ€. scopeProps
μλ νμ μ»΄ν¬λνΈμμ μ¬λ €μ€ κ° message
μ΄ λ€μ΄μμ΅λλ€.
μμ μ½λλ₯Ό μ€ννλ©΄ κ²°λ‘ μ μΌλ‘ <h1>
μ λͺ© νκ·Έμ ν¨κ» νμ μ»΄ν¬λνΈμ message
κ°μΈ Helloκ° νλ©΄μ μΆλ ₯λ©λλ€.
TIP
λ·° λ²μ 2.6μμ μ¬λ‘―μ λ¬Έλ²μ΄ v-slot
λλ ν°λΈλ‘ λ°λ μ΄μ λ μ€μ½₯μ€ μ¬λ‘―μ λ³μ μ κ·Ό λ²μ λλ¬Έμ
λλ€.
μΌλ° HTML νκ·Έμμ μ€μ½₯λ μ¬λ‘―μ μ μ©νλ©΄ μ΄ν΄νλλ° ν¬κ² λ¬Έμ κ° μμΌλ μ»΄ν¬λνΈ νκ·Έμ μ€μ½₯λ μ¬λ‘―μ μ μ©νλ κ²½μ° λ³μμ μ κ·Ό λ²μμ λν΄ νΌλμ΄ μμ μ μμ΅λλ€.
λ°λΌμ, κΈ°μ‘΄ λ κ±°μ μ½λμ κ²ΉμΉμ§ μκ² v-slot
λ° #
μΌλ‘ κ°νΈνμμ΅λλ€.
μμΈν λ΄μ©μ μ¬κΈ° (opens new window)λ₯Ό μ°Έκ³ νμΈμ.