HTML ์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ปดํฌ๋ํธ์ ์ฝํ ์ธ ๋ฅผ ์ ๋ฌํ ์ ์์ผ๋ฉด ์ ์ฉํ๋ค.
<FancyButton>
์ปดํฌ๋ํธ๋ฅผ ๋ง๋ ํ ์ฝํ ์ธ ๋ฅผ ์ ๋ฌํด๋ณด์.
<!-- FancyButton.vue -->
<template>
<button class="fancy-btn">
<slot></slot>
</button>
</template>
-> Style
์์ ์ ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ฌ์ฉํด๋ณด์
<FancyButton>
<!-- ์ฌ๋กฏ ์ฝํ
์ธ -->
Click!!
</FancyButton>
slot
์์๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ ๊ณตํ๋ ์ฝํ
์ธ ๋ฅผ ๋ํ๋ด๋ ์ฌ๋กฏ ์ฝํ
์ธ ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๋กฏ์ ํ
์คํธ ๋ฟ๋ง์๋๋ผ HTML์์, ์ปดํฌ๋ํธ ๋ฑ ๋ค์ํ ๋ชจ๋ ์ฝํ
์ธ ๊ฐ ๋ ์ ์๋ค.
<slot>
์์์ ์ด๋ฆ์ ๋ถ์ฌํ์ฌ ์ฌ๋ฌ๊ฐ์<slot>
์ ์ ์ํ ์ ์๋ค.
<!-- BaseCard.vue -->
<template>
<article>
<div>
<slot name="header"></slot>
</div>
<div>
<slot></slot>
</div>
<div>
<slot name="footer"></slot>
</div>
</article>
</template>
slot
์ name
์์ฑ์ ๋ถ์ฌํ์ฌ ํน์ ์ฌ๋กฏ ์ฝํ
์ธ ๊ฐ ๋ ๋๋ง ๋์ด์ผ ํ ์์น๋ฅผ ์ค์ ํ ์ ์๋ค.name
์ด ์๋ <slot>
์ ์ด๋ฆ์ ์์์ ์ผ๋ก default
๋ค.<!-- ๋ถ๋ชจ ์ปดํฌ๋ํธ ์ฌ์ฉ ์์ -->
<template>
<BaseCard>
<template v-slot:hedaer>์ ๋ชฉ</template>
<template v-slot:default>๋ด์ฉ</template>
<template v-slot:footer>ํธํฐ</template>
</BaseCard>
</template>
์ ์์์ฒ๋ผ name
์ด ๋ถ์ฌ๋ <slot>
์ ์ฝํ
์ธ ๋ฅผ ์ ๋ฌํ๋ ค๋ฉด v-slot
๋๋ ํฐ๋ธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฌํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ v-slot:์ ๋ฌ์ธ์
๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ ํ ์ฌ๋กฏ ์ฝํ
์ธ ์ ์ ๋ฌํ ์ ์๋ค.v-slot
์ #
๋จ์ถํค๋ก ํํํ ์ ์ด์๋ค.
<!-- ๋ถ๋ชจ ์ปดํฌ๋ํธ ์ฌ์ฉ ์์ -->
<template>
<BaseCard>
<template #hedaer>์ ๋ชฉ</template>
<template #default>๋ด์ฉ</template>
<template #footer>ํธํฐ</template>
</BaseCard>
</template>
๊ทธ๋ฆฌ๊ณ default ์ฌ๋กฏ์ ์์์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
<!-- ๋ถ๋ชจ ์ปดํฌ๋ํธ ์ฌ์ฉ ์์ -->
<template>
<BaseCard>
<template #hedaer>์ ๋ชฉ</template>
<!-- ์์์ ์ผ๋ก default slot -->
๋ด์ฉ
<template #footer>ํธํฐ</template>
</BaseCard>
</template>
์ฌ๋กฏ ์ฝํ ์ธ ๋ ์์ ์ปดํฌ๋ํธ์ ์ ์๋์ด ์์ผ๋ฏ๋ก ์์ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ ์์ญ์ ์ ๊ทผ์ ๊ฐ๋ฅํ์ง๋ง ํ์ ์ปดํฌ๋ํธ์ ์์ญ์๋ ์ ๊ทผํ ์ ์๋ค.
Render Scope์์ ์ธ๊ธํ๋ ๊ฒ์ฒ๋ผ ์ฌ๋กฏ ์ฝํ ์ธ ๋ ์์ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค. ํ์ง๋ง ์ฌ๋กฏ ์ฝํ ์ธ ์์ ์์ ์ปดํฌ๋ํธ์ ํ์ ์ปดํฌ๋ํธ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค๋ฉด ์ฐ๋ฆฌ๋ ๊ฐ๋ฐํ ๋ ๋งค์ฐ ์ ์ฉํ๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ์ผ๋ก ์ฐ๋ฆฌ๋ ์์ ์ปดํฌ๋ํธ์์
<slot>
์์๋ฅผ ์ฌ์ฉํ ๋ props๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ฒ๋ผ ์์ฑ์ ์ฌ๋กฏ ์ฝํ ์ธ ์ ์ ๋ฌํ ์ ์๋ค.
<!-- MyComponent.vue -->
<template>
<div>
<slot :text="greetingMessage" :count="count"></slot>
</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const greetingMessage = ref('Hello!!');
const count = ref(1);
return{ greetingMessage, count};
},
};
</script>