# v-slot

Vue 2.6.0์—์„œ v-slot ๋””๋ ‰ํ‹ฐ๋ธŒ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์†Œ๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. v-slot์€ ๋„ค์ž„๋“œ ์Šฌ๋กฏ(Named Slots)๊ณผ ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ(Scoped Slot) ์‚ฌ์šฉ์„ ํ†ตํ•ฉํ•œ ์ƒˆ๋กœ์šด ๋””๋ ‰ํ‹ฐ๋ธŒ ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ(Scoped Slot) ํ‘œํ˜„์€ Vue 3.0 ์—์„œ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „์—์„œ ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์ด ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋˜ ๋ฌธ์ œ์ ๊ณผ ํ•จ๊ป˜ v-slot ๋””๋ ‰ํ‹ฐ๋ธŒ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ทธ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค.

# ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์˜ ๋ฌธ์ œ์ 

Vue.js์—์„œ ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(Single Responsibility Principle) (opens new window)์„ ์ง€์ผœ์ฃผ๋ฉด ์ข‹์€ ๊ฒƒ์ฒ˜๋Ÿผ Vue.js ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ์—๋„ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์€ ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•  ๋•Œ, ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ’์„ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ์Šฌ๋กฏ์œผ๋กœ ๋ฐ”์ธ๋”ฉ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฌ์›Œ ๋ณด์ด์ง€๋งŒ, ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹จ์ผ ์ฑ…์ž„์„ ์ง€๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์œ„์—์„œ ์ฐธ์กฐํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, Vue.js์—์„œ ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์„ ์†Œ๊ฐœํ–ˆ์„ ๋•Œ, slot-scope์†์„ฑ์„ ์ถ”๊ฐ€ํ•œ <template>ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌ๋ฌธ์ด ๊ธธ์–ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.




ย 
















<!-- ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ(Foo.vue) -->
<template>
  <div>
    <slot :fooProps="fooProps"></slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      fooProps: {
        id: 1,
        msg: 'Hello',
      } 
    }
  }
}
</script>



ย 

ย 













<!-- ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ -->
<template>
  <foo>
    <template slot-scope="fooProps">
      <div>{{ fooProps }}</div>
    </template>
  </foo>
</template>

<script>
import Foo from './Foo.vue';

export default {
  components: {
    Foo
  }
}
</script>

์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ <template>ํƒœ๊ทธ๋ฅผ ํ•ญ์ƒ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Vue 2.5์—์„œ๋Š” ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์„ <template>ํƒœ๊ทธ ๋Œ€์‹ , ํ‘œํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ํƒœ๊ทธ์— ์ง์ ‘ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


ย 


<foo>
  <div slot-scope="fooProps">{{ fooProps }}</div>
</foo>

์—ฌ๊ธฐ์„œ ๋ˆˆ์—ฌ๊ฒจ๋ด์•ผ ํ•  ๋ถ€๋ถ„์€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์ธ <foo>ํƒœ๊ทธ์˜ ํ”„๋กญ์Šค ์†์„ฑ์ด ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ <div>ํƒœ๊ทธ๋กœ ์ „๋‹ฌ๋˜์—ˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ, HTML์˜ ๊ธฐ๋ณธ ํƒœ๊ทธ๋ฟ ์•„๋‹ˆ๋ผ ์ปดํฌ๋„ŒํŠธ ํƒœ๊ทธ์—์„œ๋„ ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ย 


<foo>
  <bar slot-scope="fooProps">{{ fooProps }}</bar>
</foo>

ํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉํ–ˆ์„ ๋•Œ, ์ปดํฌ๋„ŒํŠธ์˜ ๋ณต์žก์„ฑ์ด ๋Š˜์–ด๋‚˜๋ฉด ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์˜ slot-scope๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

<foo>
  <bar slot-scope="fooProps">
    <baz slot-scope="barProps">
      <div slot-scope="bazProps">
        {{ fooProp }} {{ barProp }} {{ bazProp }}
      </div>
    </baz>
  </bar>
</foo>

์ž์‹ ์ปดํฌ๋„ŒํŠธ์ธ <foo>ํƒœ๊ทธ๊ฐ€ ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด <bar>ํƒœ๊ทธ์— slot-scope๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ , ์ด์–ด์„œ <bar>ํƒœ๊ทธ๋Š” ์ด์–ด์„œ <baz>ํƒœ๊ทธ์— ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ค‘์ฒฉ๋œ ์ปดํฌ๋„ŒํŠธ์—์„œ ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ค props์„ ์˜ฌ๋ ค์ฃผ๊ณ  ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰ 2.5 ๋ฒ„์ „์—์„œ ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•  ๋•Œ slot-scope์†์„ฑ์„ <template>ํƒœ๊ทธ์—๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ธฐ์กด ํƒœ๊ทธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•œ ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, v-slot๋””๋ ‰ํ‹ฐ๋ธŒ๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

TIP

Vue 3.0์—์„œ๋Š” slot-scope๋ฌธ๋ฒ•์ด ์ œ๊ฑฐ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, Vue 3.0์—์„œ slot-scope๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด eslint๊ฐ€ v-slot์œผ๋กœ ๋ณ€ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค. (Vue CLI๋ฅผ ์ด์šฉํ•ด Vue 3.0์„ ์„ค์น˜ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.)

# v-slot ๊ธฐ๋ณธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

v-slot์€ ์Šฌ๋กฏ์— name ์†์„ฑ์„ ์ง€์ •ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋„ค์ž„๋“œ ์Šฌ๋กฏ(Named Slots)๊ณผ ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์„ ํ•œ ๋ฒˆ์— ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ๋„ค์ž„๋“œ ์Šฌ๋กฏ ํ‘œํ˜„

<!-- ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ(Foo.vue) -->
<div>
  <!-- ํ—ค๋” ์˜์—ญ -->
  <slot name="header"></slot>
  <!-- ๋ณธ๋ฌธ ์˜์—ญ -->
  <slot></slot>
  <!-- ํ‘ธํ„ฐ ์˜์—ญ -->
  <slot name="footer"></slot>
</div>



ย 




ย 




ย 




<!-- ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ -->
<foo>
  <!-- ํ—ค๋” ์˜์—ญ -->
  <template v-slot:header>
    <h1>Header</h1>
  </template>

  <!-- ๋ณธ๋ฌธ ์˜์—ญ -->
  <template v-slot:default>
    <div>Body</div>
  </template>

  <!-- ํ‘ธํ„ฐ ์˜์—ญ -->
  <template v-slot:footer>
    <div>Footer</div>
  </template>
</foo>

TIP

v-slot:default๋Š” ์Šฌ๋กฏ์— name ์†์„ฑ์„ ๋ถ™์ด์ง€ ์•Š์€ ์˜์—ญ์— ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

๋ Œ๋”๋ง ๋œ HTML์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<div>
  <h1>Header</h1>
  <div>Body</div>
  <div>Footer</div>
</div>

# ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ ํ‘œํ˜„



ย 












<!-- ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ(Foo.vue) -->
<template>
  <slot :msg="msg"></slot>
</template>

<script>
export default {
  data() {
    return {
      msg: 'Hello!',
    };
  },
};
</script>


ย 
ย 
ย 


<!-- ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ -->
<foo>
  <template v-slot:default="slotProps">
    <h1>{{ slotProps.msg }}</h1>  <!-- <h1>Hello!</h1> -->
  </template>
</foo>

# v-slot์˜ ์ด์ 

<template> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์žฅํ™ฉํ•ด์ง€๋Š” ํ‘œํ˜„์„ ๊ฐ„๋žตํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋•๋ถ„์— ๊ฐ€๋…์„ฑ ๋˜ํ•œ ์ข‹์•„์ง‘๋‹ˆ๋‹ค.

<!-- old -->
<foo>
  <template slot-scope="{ msg }">
    {{ msg }}
  </template>
</foo>
<!-- new -->
<foo v-slot="{ msg }">{{ msg }}</foo>

์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์˜ ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

<!-- old -->
<foo>
  <bar slot-scope="foo">
    <baz slot-scope="bar">
      <div slot-scope="baz">
        {{ foo }} {{ bar }} {{ baz }}
      </div>
    </baz>
  </bar>
</foo>
<!-- new -->
<foo v-slot="foo">
  <bar v-slot="bar">
    <baz v-slot="baz">
      {{ foo }} {{ bar }} {{ baz }}
    </baz>
  </bar>
</foo>

# v-slot ์‘์šฉ ํ‘œํ˜„ ๋ฐฉ์‹

# ์ถ•์•ฝ ํ‘œํ˜„

์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์€ v-slot๋’ค์— props๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ๋ฉด ํ•˜์œ„ ํƒœ๊ทธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์•ž์„œ Vue 2.5์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋˜ <template>ํƒœ๊ทธ๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  default ์Šฌ๋กฏ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ปดํฌ๋„ŒํŠธ ์ž์ฒด์— v-slot์†์„ฑ์„ ์ง€์ •ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 



<foo v-slot:default="slotProps">
  <h1>{{ slotProps.msg }}</h1>
</foo>

WARNING

ํ•˜์ง€๋งŒ ์Šฌ๋กฏ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ๋Š” ๋ฐ˜๋“œ์‹œ <template>ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ ํ•˜์œ„์— ํ‘œํ˜„ํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ v-slot:default๋Š” v-slot์œผ๋กœ ์ถ•์•ฝํ•˜์—ฌ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 



<foo v-slot="slotProps">
  <h1>{{ slotProps.msg }}</h1>
</foo>

๋‹จ, ์ปดํฌ๋„ŒํŠธ ์ž์ฒด์— v-slot์„ ์‚ฌ์šฉํ•˜๊ณ , ํ•˜์œ„์— ์ด๋ฆ„์„ ๊ฐ€์ง„ v-slot์„ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์˜ ๋ณ€์ˆ˜ ๋ฒ”์œ„๊ฐ€ ๋ชจํ˜ธํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” default ์Šฌ๋กฏ์ด foo ์ปดํฌ๋„ŒํŠธ์— ์„ ์–ธ๋˜์—ˆ๊ณ , ํ•˜์œ„์— other ์ด๋ฆ„์„ ๊ฐ€์ง„ ์Šฌ๋กฏ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.


ย 

ย 




<!-- v-slot:other์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜ ๋ฐœ์ƒ -->
<foo v-slot="slotProps">
  {{ slotProps.msg }}
  <template v-slot:other="otherSlotProps">
    <!-- ์ด๊ณณ์— slotProps๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์—†์Œ. -->
  </template>
</foo>

์œ„ ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•˜๋ ค๋ฉด <template> ํƒœ๊ทธ๋กœ ๋ช…ํ™•ํ•œ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , default name์„ ๊ฐ€์ง„ v-slot ์ถ•์•ฝ ๋ฌธ๋ฒ•์€ <template>ํƒœ๊ทธ๋กœ ๋ช…ํ™•ํ•œ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•ด ์ค€๋‹ค๋ฉด, ์ด๋ฆ„์„ ๊ฐ€์ง„ ์Šฌ๋กฏ(<v-slot:other>๋“ฑ)๊ณผ ํ˜ผ์šฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ย 


ย 




<foo>
  <template v-slot="slotProps">
    {{ slotProps.msg }}
  </template>
  <template v-slot:other="otherSlotProps">
    {{ otherSlotProps.something }}
  </template>
</foo>

# ํŠน์ˆ˜ ๊ธฐํ˜ธ ํ‘œํ˜„

v-slot์€ v-bind(:), v-on(@)๊ณผ ๊ฐ™์ด ํŠน์ˆ˜ ๊ธฐํ˜ธ๋ฅผ ํ†ตํ•ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ˆ˜ ๊ธฐํ˜ธ๋Š” #์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด v-slot:default๋Š” #default๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 



<foo #default="slotProps">
  <h1>{{ slotProps.msg }}</h1>
</foo>

๋‹จ, #="slotProps"๊ตฌ๋ฌธ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํŠน์ˆ˜ ๊ธฐํ˜ธ๋กœ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, #default="slotProps"์™€ ๊ฐ™์ด ๋ฐ˜๋“œ์‹œ ์Šฌ๋กฏ ์ด๋ฆ„์„ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# Destructuring ํ‘œํ˜„

์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์˜ ๋ณ€์ˆ˜์— ES6 ๋ฌธ๋ฒ•์ธ, ๊ตฌ์กฐ ๋ถ„ํ•ด ๋ฌธ๋ฒ•(Destructuring) ํ‘œํ˜„๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ย 



<foo v-slot="{ msg }">
  <h1>{{ msg }}</h1>
</foo>

# Dynamic Slot Names ํ‘œํ˜„

์Šฌ๋กฏ name์„ ๋™์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<foo>
  <template v-slot:[dynamicSlotName]>
    ...
  </template>
</foo>

WARNING

์Šค์ฝฅ๋“œ ์Šฌ๋กฏ์˜ slot-scope ํ‘œํ˜„์€ Vue 3.0 ์ดํ•˜์˜ ๋ฒ„์ „์—์„œ๋Š” ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ Vue 3.0 ์ด์ƒ ๋ฒ„์ „์—์„œ ์‚ญ์ œ๋˜์—ˆ์œผ๋ฏ€๋กœ Vue 2.6 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, v-slot๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ํ†ตํ•ด ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.