Nuxt 를 배워보자

Nuxt에서 Slot을 활용하여 유연한 컴포넌트 만들기: 다양한 예제와 상세 설명

_Blue_Sky_ 2025. 2. 16. 18:25
728x90
728x90

Nuxt는 Vue.js를 기반으로 서버 사이드 렌더링(SSR)과 다양한 기능을 제공하는 프레임워크입니다. 이 중 Slot은 컴포넌트의 재사용성을 높이고, 부모 컴포넌트에서 자식 컴포넌트의 내용을 자유롭게 커스터마이징할 수 있도록 하는 강력한 기능입니다.

Slot이란 무엇일까요?

Slot은 컴포넌트 내부에서 특정 위치를 지정하여, 부모 컴포넌트에서 해당 위치에 원하는 내용을 채워 넣을 수 있도록 하는 기능입니다. 마치 퍼즐 조각처럼, 부모 컴포넌트에서 만든 내용을 자식 컴포넌트의 특정 자리에 끼워 맞출 수 있다고 생각하면 쉽습니다. 이를 통해 컴포넌트를 재사용하면서도 다양한 형태의 UI를 만들 수 있습니다.

Slot의 종류

  • Default Slot: 명시적인 이름이 없는 기본 슬롯입니다. 컴포넌트 내부에 <slot> 태그만 사용하면 됩니다.
  • Named Slot: 이름을 지정하여 여러 개의 슬롯을 사용할 수 있습니다. <slot name="slot-name"> 형태로 사용합니다.
  • Scoped Slot: 슬롯 내부에서 부모 컴포넌트의 데이터에 접근하여 동적으로 내용을 변경할 수 있습니다.
728x90

Slot 사용 예제

1. Default Slot

코드 스니펫
 
<template>
  <div>
    <slot></slot>
  </div>
</template>
<template>
  <MyComponent>
    <p>Default Slot 내용</p>
  </MyComponent>
</template>

위 예제에서 MyComponent 컴포넌트의 <slot> 태그 부분에 ParentComponent에서 전달한 <p> 태그가 채워집니다.

2. Named Slot

<template>
  <div>
    <slot name="header"></slot>
    <p>본문 내용</p>
    <slot name="footer"></slot>
  </div>
</template>
<template>
  <MyComponent>
    <h1 slot="header">제목</h1>
    <p slot="footer">바닥글</p>
  </MyComponent>
</template>

위 예제에서는 header와 footer라는 두 개의 Named Slot을 사용하여 컴포넌트의 구조를 더욱 유연하게 구성할 수 있습니다.

3. Scoped Slot

<template>
  <div>
    <slot :item="item" v-for="item in items"></slot>
  </div>
</template>
<template>
  <MyComponent :items="['item1', 'item2', 'item3']">
    <template v-slot:item="{ item }">
      <p>{{ item }}</p>
    </template>
  </MyComponent>
</template>

위 예제에서는 MyComponent 컴포넌트에서 items 배열을 전달하고, Scoped Slot을 통해 각 아이템에 대한 정보를 사용하여 동적으로 내용을 생성합니다.

Slot의 활용 사례

  • 레이아웃 컴포넌트: 헤더, 푸터, 메인 콘텐츠 영역을 Slot으로 구성하여 다양한 페이지에 적용
  • 폼 컴포넌트: 입력 필드, 버튼 등을 Slot으로 구성하여 커스터마이징 가능한 폼 생성
  • 테이블 컴포넌트: 테이블 헤더, 바디, 푸터를 Slot으로 구성하여 다양한 형태의 테이블 생성
  • 카드 컴포넌트: 카드의 제목, 내용, 이미지 영역을 Slot으로 구성하여 다양한 스타일의 카드 생성

Slot은 Nuxt 컴포넌트를 더욱 유연하고 재사용 가능하게 만들어주는 강력한 기능입니다. Slot을 효과적으로 활용하면 복잡한 UI를 간결하고 관리하기 쉽게 구성할 수 있습니다. 다양한 예제를 통해 Slot의 활용법을 익히고, 여러분의 프로젝트에 적용하여 더욱 효율적인 개발을 해보세요.

참고: 위 예제는 간단한 예시이며, 실제 프로젝트에서는 더욱 복잡하고 다양한 형태의 Slot을 사용할 수 있습니다. Nuxt 공식 문서를 참고하여 더 자세한 내용을 확인해 보세요.

728x90

 


Nuxt에서 Slot과 유사한 태그 및 기능

Nuxt.js에서 컴포넌트 간에 내용을 전달하고 구조를 유연하게 구성하는 데 사용되는 Slot 외에도 다양한 태그와 기능들이 있습니다. 이들은 각각의 특징과 용도에 따라 사용됩니다.

1. NuxtLayout

  • 용도: 전체 페이지의 레이아웃을 정의하고, 다른 페이지 컴포넌트의 내용을 특정 영역에 삽입합니다.
  • 기능:
    • slot을 이용하여 페이지 내용을 지정된 위치에 렌더링합니다.
    • 헤더, 푸터, 사이드바 등 공통적인 레이아웃 요소를 정의하고 페이지별로 내용을 채울 수 있습니다.
<template>
  <div>
    <header>Header</header>
    <main>
      <slot />
    </main>
    <footer>Footer</footer>
  </div>
</template>

2. NuxtPage

  • 용도: 현재 페이지의 내용을 나타냅니다.
  • 기능:
    • NuxtLayout 내부에서 사용되어 페이지의 실제 내용을 표시합니다.
    • 동적 라우팅과 함께 사용하여 다양한 페이지를 구성할 수 있습니다.
 
<template>
  <div>
    <h1>Home Page</h1>
  </div>
</template>

3. NuxtLink

  • 용도: 다른 페이지로 이동하는 링크를 생성합니다.
  • 기능:
    • to 속성을 사용하여 이동할 페이지를 지정합니다.
    • Nuxt.js의 라우팅 시스템과 연동하여 SEO에 유리한 링크를 생성합니다.
<template>
  <nuxt-link to="/about">About Us</nuxt-link>
</template>

4. NuxtLinkExternal

  • 용도: 외부 링크를 생성합니다.
  • 기능:
    • to 속성에 외부 URL을 지정합니다.
    • target 속성을 사용하여 새로운 탭에서 링크를 열 수 있습니다.

<!-- end list -->

  Nuxt.js 공식 문서

5. NuxtChild

  • 용도: 동적 라우팅에서 자식 라우트 컴포넌트를 렌더링합니다.
  • 기능:
    • 부모 라우트 컴포넌트에서 자식 라우트 컴포넌트를 동적으로 로드합니다.

6. Teleport

  • 용도: 컴포넌트의 내용을 다른 DOM 요소 안으로 이동시킵니다.
  • 기능:
    • 컴포넌트의 특정 부분을 다른 곳에 렌더링할 때 유용합니다.
    • 예를 들어, 모달 창을 렌더링할 때 body 태그 안으로 이동시킬 수 있습니다.

<!-- end list -->

<template>
  <teleport to="body">
    <div class="modal">
      </div>
  </teleport>
</template>

Nuxt.js는 컴포넌트 기반의 프레임워크로, 다양한 태그와 기능을 제공하여 유연하고 효율적인 웹 애플리케이션 개발을 지원합니다. Slot은 컴포넌트 내부의 내용을 동적으로 채우는 데 사용되며, NuxtLayout, NuxtPage, NuxtLink 등은 각각 특정한 목적을 가지고 사용됩니다. Teleport는 컴포넌트의 내용을 다른 DOM 요소 안으로 이동시키는 데 유용한 기능입니다.

핵심:

  • Slot: 컴포넌트 내부의 내용을 채우는 데 사용
  • NuxtLayout: 전체 페이지의 레이아웃을 정의
  • NuxtPage: 현재 페이지의 내용을 나타냄
  • NuxtLink: 내부 또는 외부 링크 생성
  • NuxtLinkExternal: 외부 링크 생성
  • NuxtChild: 동적 라우트에서 자식 라우트 컴포넌트 렌더링
  • Teleport: 컴포넌트 내용을 다른 DOM 요소로 이동
728x90
728x90