카테고리 없음

vue - slot

이채야채 2024. 5. 27. 15:42

vue는 slot을 사용하여 할 수 있는 일이 많이 있는듯 싶다.

자식컴포넌트에게 간단하게 무언가를 전달할수가있는데

그때 사용하고 싶은 구간에서 slot태그를 사용해서 넣어본다.

 

<script setup>
import SubmitButton from './SubmitButton.vue'
</script>

<template>
  <!-- 대체 텍스트 사용 -->
  <SubmitButton />
  
  <!-- 사용자 정의 텍스트 제공 -->
  <SubmitButton>부모컴포넌트가이김</SubmitButton>
</template>

 

이렇게 해줬을때, 

자식 컴포넌트안에 

<template>
  <button type="submit">
	  <slot>
    	제출 <!-- 대체 컨텐츠 -->
  	</slot>
	</button>
</template>

 

이렇게 사용했어도 버튼모양은 제출이 뜨는것이 아니고

부모컴포넌트가이김 이 나온다.

즉, 부모컴포넌트에서 무언가를 넘겨줬으면 대체컨텐츠보다 위에서 넘겨준것이 우세하다는 이야기다.

 

좀더 심화하여, 

 

이름이 있는 슬롯을 공부해보자.

<div class="container">
  <header>
    <!-- 우리는 여기에 헤더 컨텐츠를 원합니다. -->
  </header>
  <main>
    <!-- 우리는 여기에 메인 컨텐츠를 원합니다. -->
  </main>
  <footer>
    <!-- 우리는 여기에 푸터 컨텐츠를 원합니다. -->
  </footer>
</div>

 

위와같은 모양의 구조를 만든다고 가정해보자,

name이라는 특수속성을 사용한다고 할때 마치 ID처럼 SLOT에게 이름을 부여해줄 수 잇다.

 

<div class="container">
  <header>
    <slot name="header"></slot>
  </header>
  <main>
    <slot></slot>
  </main>
  <footer>
    <slot name="footer"></slot>
  </footer>
</div>

 

MAIN부분에 이름 속성없는 아이는 임시적으로 default라는 이름을 가지게도니다.

 

<BaseLayout>
  <template v-slot:header>
    <!-- 헤더 슬롯의 컨텐츠 -->
  </template>
</BaseLayout>

 

이름있는 slot전달할때는 template을 함께 사용해서 전달을 해야한다.

 

이름있는 슬롯컨텐츠 전달할때 이렇게 사용해도된다

<BaseLayout>
  <template #header>
    <h1>다음은 페이지 제목일 수 있습니다.</h1>
  </template>

  <template #default>
    <p>주요 내용에 대한 단락입니다.</p>
    <p>그리고 또 하나.</p>
  </template>

  <template #footer>
    <p>다음은 연락처 정보입니다.</p>
  </template>
</BaseLayout>

 

 

template 엘리먼트 내부의  해당슬롯으로 전달된다.

 

자식부분에서 그렇담 어떻게 보여지는가?

<template>
  <div class="container">
    <header>
      <slot name="header"></slot>
    </header>
    <main>
      <slot></slot>
    </main>
    <footer>
      <slot name="footer"></slot>
    </footer>
  </div>
</template>

<style>
  footer {
    border-top: 1px solid #ccc;
    color: #666;
    font-size: 0.8em;
  }
</style>

 

이름으로 엮어서, 여러가지 정보를 다 다르게 밑으로 내려줄수있다는 말이다.