0Pricing
Vue Academy · レッスン

通知・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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. プラグインアーキテクチャとapp.use()
  2. プラグインでのグローバルプロパティとprovide/inject
  3. 通知・Toastプラグインの例
  4. Vueプラグインの公開と型付け
← Vue Academyに戻る