- 이전 포스팅에서 slot태그를 이용하여 컴포넌트 내용을 출력하였다.
- 이번 포스팅에서는 slot태그에 관하여 조금 더 알아보자.
1. Fallback content
[App.vue]
<template>
<MyBtn>
Banana
</MyBtn>
</template>
<script>
import MyBtn from '~/components/MyBtn'
export default {
components: {
MyBtn
}
}
</script>
[MyBtn.vue]
<template>
<div class="btn">
<slot></slot>
</div>
</template>
ㅌ
<script>
export default {
}
</script>
<style scoped lang="scss">
.btn {
display: inline-block;
margin: 4px;
padding: 6px 12px;
border-radius: 4px;
background-color: gray;
color: white;
cursor: pointer;
}
</style>
[작동순서]
a) slot 태그 사이에 내용이 있는 경우
[출력화면]
- 반드시 컴포넌트에 내용(=content)을 삽입해야만 slot태그에서 출력이 되는 것이 아니다.
- 위의 예시처럼 slot 태그 자체에 내용(=content)을 삽입하여 출력할수도 있다.
b) slot 태그 사이에 내용이 있고 컴포넌트에도 내용이 있는 경우
[출력화면]
- 컴포넌트와 slot태그 모두 content를 포함하고 있는 경우, 위의 예시처럼 컴포넌트의 내용이 우선적으로 출력된다.
- slot 태그에 입력되는 content는 default 값처럼 작동한다.
- 컴포넌트에 content가 존재하면, 해당 컴포넌트의 content가 출력된다.
- 컴포넌트에 content가 없다면, slot태그의 content가 출력된다.
*Fallback(= 대체) content
- slot태그에 삽입되어있는 content를 부르는 용어
- 컴포넌트에 content가 없을 때, slot 태그에서 출력되는 content를 의미한다.
2. Named slot
a) 예제 1
[예제코드]
[출력화면]
- MyBtn 컴포넌트 사이의 span태그 두개가 위의 사진처럼 순서대로 출력되는 것을 확인할 수 있다.
- 만약 이 span 태그가 출력되는 순서가 중요하다면, 그 순서를 직접 정해줄 수 있는데 이를 named slot이라고 한다.
- 이름을 갖는 slot이라고 부른다.
b) v-slot → #(v-slot의 약어)
- 우선 문자열의 구분을 위해 (B) 내용을 icon이라고 하자. Banana는 그냥 text라고 하자.
- 항상 icon 다음에 text가 출력되도록 설정해보자.
- 하지만, 위의 코드는 제대로 작동하지 않고 에러를 발생시킨다.
- 에러가 발생되는 이유는 v-slot이라는 이름의 라이브러리가 존재하지 않기 때문이다.
- 원래 이름은 v-slot이 맞지만, Vue에서는 축약어인 샵(#) 기호를 쓰도록 한다.
[출력화면]
[순서가 보장된다는 의미]
- 위의 코드 사진처럼 App.vue의 태그 순서가 변경되더라도 출력 내용은 변하지 않는다.
- MyBtn.vue에서 이미 slot에 해당 이름을 할당해놓았기 때문에 동일하게 icon부터 출력되게 된다.
'Front-end > Vue3' 카테고리의 다른 글
26. Vue - 컴포넌트 Refs (0) | 2021.05.28 |
---|---|
25. Vue- provide, inject (0) | 2021.05.27 |
23. Vue- Emit(2) (0) | 2021.05.24 |
22. Vue - Emit(1) (0) | 2021.05.24 |
21. Vue - 속성 상속 (0) | 2021.05.21 |
댓글