0Pricing
Vue Academy · 강의

알림 및 Toast 플러그인 예제

반응형 대기열, 설치 로직과 provide/inject를 통한 프로그래밍 방식 API를 갖춘 알림 플러그인을 만듭니다.

알림 및 Toast 플러그인 예제은(는) CoddyKit의 무료 Vue Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Vue Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Vue Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

목표: 토스트 플러그인

토스트 알림 플러그인을 만들어 보겠습니다. 플러그인은 메시지의 반응형 대기열을 관리하고 notify API를 노출하며 토스트를 전역으로 렌더링합니다. 모든 컴포넌트는 inject 또는 컴포저블을 통해 토스트를 표시할 수 있습니다.

반응형 대기열

핵심 상태는 토스트 객체 배열을 담은 반응형 ref입니다. 항목을 추가하거나 제거하면 대기열을 렌더링하는 모든 컴포넌트가 자동으로 업데이트됩니다.

import { ref } from 'vue'

const toasts = ref([])
// each toast: { id, message, type }

counter로 고유 ID 만들기

각 토스트에는 키 지정과 제거에 사용할 고유한 id가 필요합니다. Date.now()가 아니라 증가하는 counter를 사용하세요. 같은 밀리초에 두 토스트가 발생하면 타임스탬프가 충돌하기 때문입니다.

let counter = 0

function nextId() {
  // guaranteed unique even for rapid-fire toasts
  return ++counter
}

notify 함수

notify는 공개 API입니다. 새 토스트를 새로운 id와 함께 추가하고 일정 시간이 지나면 제거하도록 예약합니다.

function notify(message, type = 'info', duration = 3000) {
  const id = nextId()
  toasts.value.push({ id, message, type })
  setTimeout(() => dismiss(id), duration)
  return id
}

토스트 닫기

dismiss는 반응형 배열에서 토스트를 필터링해 id로 제거합니다. toasts.value를 다시 할당해도 반응성이 유지됩니다.

function dismiss(id) {
  toasts.value = toasts.value.filter(t => t.id !== id)
}

서비스로 묶기

상태와 함수를 하나의 서비스 객체로 묶습니다. 이 객체를 앱에 제공하게 됩니다.

const toastService = {
  toasts,      // reactive ref (read in the UI)
  notify,      // create a toast
  dismiss      // remove a toast
}

플러그인의 install 메서드

플러그인의 install은 app.provide를 통해 서비스를 제공하므로 모든 컴포넌트가 이를 주입할 수 있습니다. 안전성을 위해 Symbol 키를 내보냅니다.

export const toastKey = Symbol('toast')

export default {
  install(app) {
    app.provide(toastKey, toastService)
    app.config.globalProperties.$toast = toastService
  }
}

토스트 컨테이너 등록하기

플러그인은 대기열을 렌더링하는 전역 ToastContainer 컴포넌트도 등록할 수 있습니다. 따라서 사용하는 쪽에서는 앱 루트 근처에 한 번만 배치하면 됩니다.

import ToastContainer from './ToastContainer.vue'

install(app) {
  app.provide(toastKey, toastService)
  app.component('ToastContainer', ToastContainer)
}

컨테이너 템플릿

컨테이너는 주입된 대기열을 읽고 각 토스트를 렌더링합니다. 각 토스트에는 고유한 id를 기준으로 클릭하면 닫히는 처리기가 연결됩니다.

<script setup>
import { inject } from 'vue'
import { toastKey } from './toast'
const { toasts, dismiss } = inject(toastKey)
</script>

<template>
  <div class="toasts">
    <div v-for="t in toasts" :key="t.id" :class="t.type"
         @click="dismiss(t.id)">
      {{ t.message }}
    </div>
  </div>
</template>

편의 컴포저블

inject를 useToast 컴포저블로 감싸면 컴포넌트에 깔끔한 API를 제공하고 플러그인이 설치되지 않았을 때 유용한 오류도 표시할 수 있습니다.

import { inject } from 'vue'
import { toastKey } from './toast'

export function useToast() {
  const service = inject(toastKey)
  if (!service) throw new Error('Toast plugin not installed')
  return service
}

컴포넌트에서 사용하기

마지막으로 모든 컴포넌트는 컴포저블을 통해 알림을 표시합니다. app.use(toastPlugin)을 등록하고 루트 근처에 <ToastContainer />를 한 번 배치하세요.

<script setup>
import { useToast } from './toast'
const { notify } = useToast()

function save() {
  notify('Saved successfully', 'success')
}
</script>

빠른 확인

토스트 플러그인 설계에 대한 이해도를 확인해 보세요.

복습

토스트 플러그인을 만들었습니다.

  • 반응형 ref 배열이 토스트 대기열을 보관합니다
  • 증가하는 counter가 충돌 없이 고유한 id를 제공합니다
  • notify는 공개 API이고 dismiss는 id로 항목을 제거합니다
  • install은 app.provide를 통해 서비스를 제공합니다
  • useToast 컴포저블이 편리하게 사용할 수 있도록 inject를 감쌉니다

자주 묻는 질문

“알림 및 Toast 플러그인 예제” 강의는 무료인가요?

네 — “알림 및 Toast 플러그인 예제” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Vue Academy 강의 전체를 잠금 해제할 수 있습니다. Vue Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“알림 및 Toast 플러그인 예제”에서 뭘 배우나요?

반응형 대기열, 설치 로직과 provide/inject를 통한 프로그래밍 방식 API를 갖춘 알림 플러그인을 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 Vue Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Vue Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Vue Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“알림 및 Toast 플러그인 예제” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Vue Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Vue Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 플러그인 아키텍처와 app.use()
  2. 플러그인의 전역 속성과 provide/inject
  3. 알림 및 Toast 플러그인 예제
  4. Vue 플러그인 배포와 타입 지정
← Vue Academy(으)로 돌아가기