알림 및 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 플러그인 아키텍처와 app.use()
- 플러그인의 전역 속성과 provide/inject
- 알림 및 Toast 플러그인 예제
- Vue 플러그인 배포와 타입 지정