通知・Toastプラグインの例
トースタープラグインの構築:リアクティブなキュー、install処理、provide/injectによるプログラムAPI
「通知・Toastプラグインの例」はCoddyKit上の無料Vue Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはVue Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Vue Academyコースには全4レッスンが含まれています。
目標:トーストプラグイン
トースト通知プラグインを構築します。リアクティブなメッセージキューを管理し、notify APIを公開して、トーストをアプリ全体に描画します。どのコンポーネントからでも、injectまたはコンポーザブルを通じてトーストを表示できます。
リアクティブなキュー
中心となる状態は、トーストオブジェクトの配列を保持するリアクティブなrefです。項目を追加または削除すると、キューを描画しているすべてのコンポーネントが自動的に更新されます。
import { ref } from 'vue'
const toasts = ref([])
// each toast: { id, message, type }カウンターによる一意なID
各トーストには、キー付けと削除に使う一意のidが必要です。Date.now()ではなくインクリメントするカウンターを使ってください。同じミリ秒に2つのトーストを表示すると、タイムスタンプが衝突する可能性があるためです。
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)
}サービスへのまとめ上げ
状態と関数を1つのサービスオブジェクトにまとめます。このオブジェクトをプラグインからアプリにprovideします。
const toastService = {
toasts, // reactive ref (read in the UI)
notify, // create a toast
dismiss // remove a toast
}プラグインのinstallメソッド
プラグインのinstallはapp.provideを通じてサービスを提供するため、どのコンポーネントからでもinjectできます。安全に利用できるよう、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配列でトーストキューを保持します - インクリメントするカウンターで衝突しない一意のIDを生成します
notifyが公開APIで、dismissがIDを指定して削除しますinstallでapp.provideを通じてサービスを提供しますuseToastコンポーザブルでinjectをラップし、使いやすくします
よくある質問
「通知・Toastプラグインの例」レッスンは無料ですか?
はい。「通知・Toastプラグインの例」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Vue Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Vue Academyコースには全4レッスンが含まれています。
「通知・Toastプラグインの例」で何を学びますか?
トースタープラグインの構築:リアクティブなキュー、install処理、provide/injectによるプログラムAPI ブラウザで直接実行するハンズオンコードでVue Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Vue Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのVue Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「通知・Toastプラグインの例」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このVue Academyレッスンでコードを書いて実行できますか?
はい。すべてのVue Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。