<template>
<!--부모 컴포넌트-->
<ChildComponent>
<button>버튼</button>
</ChildComponent>
</template>
<template>
<div>
<!--부모에서 정의한 '버튼'이 위치합니다 -->
<slot></slot>
</div>
</template>
<template>
<!--부모 컴포넌트-->
<ChildComponent>
<button slot="left">왼쪽 버튼</button>
<button slot="right">오른쪽 버튼</button>
</ChildComponent>
</template>
<template>
<div>
<!--부모에서 정의한 '왼쪽 버튼'이 위치합니다 -->
<slot name="left"></slot>
<!--부모에서 정의한 '오른쪽 버튼'이 위치합니다 -->
<slot name="right"></slot>
</div>
</template>
/* 자식 컴포넌트 */
<template>
<div>
<header>
<slot name="child" :childData="childData" :close="close">
<button>버튼</button>
</slot>
</header>
<div>
<slot name="body">
<p>기본 바디</p>
</slot>
</div>
</div>
</template>
<script>
export default {
name: "BaseModal",
data() {
return {
childData: "child",
active: false
};
},
methods: {
close() {
this.active = false;
}
}
};
</script>
/* 부모 컴포넌트*/
<template>
<div>
<BaseModal>
<!--자식에서 사용하던 name="child"로 감싸진 태그의 함수, 변수 모두 가져옵니다.-->
<template slot="child" slot-scope="slotProps">
<button @click="slotProps.close">닫기</button>
<!-- { childData: 'child' } -->
{{ slotProps }}
</template>
<p slot="body">바디입니다.</p>
</BaseModal>
</div>
</template>
<template>
<div>
<BaseModal>
<template v-slot:child="slotProps">
<button @click="slotProps.close">닫기</button>
<!-- { hello: 'hello' } -->
{{ slotProps }}
</template>
<template v-slot:body>
<p>바디입니다.</p>
</template>
</BaseModal>
</div>
</template>
slot , slot-scope는 Vue3에서는 지원하지 않음, Vue3부터는 v-slot을 이용