본 내용은 인프런 장기효(캡틴판교)님의 Vue.js 완벽 가이드 - 실습과 리팩토링으로 배우는 실전 개념 강의를 토대로 작성하였습니다.
slot
- 컴포넌트 내에 slot 태그를 정의
- slot 태그 안은 비어있음
- slot 태그 안의 내용은 상위 컴포넌트에서 정의
- 하위 컴포넌트에서 상위 컴포넌트로부터 정의될 영역에 slot태그를 넣고 name을 지정
- 상위 컴포넌트에서 하위 컴포넌트의 slot을 정의할 때 slot의 name에 맞게 적용
- 하위 컴포넌트를 부르는 페이지마다 데이터에 접근하는 속성이 다를 때 사용하면 유용
예시
- 하위 컴포넌트
- slot 태그 정의
<template>
<div class="user-container">
<div class="fa-user">
</div>
<div class="user-description">
<slot name="username">
<!-- 상위 컴포넌트에서 정의할 영역 -->
<!-- 미완성인 상태로 남겨놓고 상위 컴포넌트에서 정의 -->
</slot>
<div class="time">
<slot name="time"></slot>
<!-- 상위 컴포넌트에서 정의할 영역 -->
</div>
<slot name="karma"></slot>
</div>
</div>
</template>
...
- 상위 컴포넌트1
- 하위 컴포넌트에서 사용할 slot 내부를 정의
<template>
<div>
<user-profile>
<div slot="username">{{ userInfo.id }}</div>
<template slot="time">{{ userInfo.created }}</template>
<div slot="karma">{{ userInfo.karma }}</div>
</user-profile>
</div>
</template>
...
- 상위 컴포넌트2
- 상위 컴포넌트1과 데이터 접근이 다름
- slot을 사용하면 이와 같이 데이터 접근이 달라도 동일한 하위 컴포넌트를 사용할 수 있음
<template>
<div>
<section>
<!-- 사용자 정보 -->
<user-profile :info="fetchedItem">
<!-- 하위 컴포넌트 정의 -->
<div slot="username">{{ fetchedItem.user }}</div>
<template slot="time">{{ fetchedItem.time_ago }}</template>
</user-profile>
</section>
<section>
<h2>{{ fetchedItem.title }}</h2>
</section>
<section>
<!-- 질문 댓글 -->
<div v-html="fetchedItem.content">
</div>
</section>
</div>
</template>
...
Reference
'programming study > Vue' 카테고리의 다른 글
Vue.js - HOC (0) | 2022.01.11 |
---|---|
Vue.js - 스피너 (0) | 2022.01.10 |
Vue.js - 데이터 흐름 처리 (0) | 2022.01.05 |
Vue.js - 공통 컴포넌트 구현(2) - computed, tempalte와 v-if (0) | 2022.01.03 |
Vue.js - 컴포넌트 공통화, 공통 컴포넌트 구현(1) (0) | 2021.12.29 |