Skip to content

Headless-режим и мульти-инстансы

useToastState — headless-режим

Возвращает сырые реактивные данные очереди. Используйте для построения полностью кастомного UI уведомлений — <ToastContainer> не нужен.

ts
const { active, pending, count, has } = useToastState(context?: ToastContext)

Возвращаемое значение

СвойствоТипОписание
activeComputedRef<ToastItem[]>Текущие видимые тосты (исключая скрытые сгруппированные)
pendingComputedRef<ToastItem[]>Тосты, ожидающие слота
countComputedRef<number>active.value.length
has(id)(id: string) → booleanПроверить, активен ли тост

Пример — полностью кастомный рендер

vue
<script setup lang="ts">
import { useToast, useToastState } from 'vue-toast-kit'

const toast = useToast()
const { active } = useToastState()
</script>

<template>
  <!-- Без <ToastContainer> — рендерим полностью с нуля -->
  <div class="my-notifications">
    <div
      v-for="t in active"
      :key="t.id"
      :class="`notification notification--${t.options.type}`"
      @mouseenter="t.pause()"
      @mouseleave="t.resume()"
    >
      <span>{{ t.message }}</span>
      <button @click="t.dismiss()">✕</button>
      <div class="progress" :style="{ width: `${t.remaining.value * 100}%` }" />
    </div>
  </div>
</template>

Каждый ToastItem в active полностью реактивен:

Свойство / МетодТипОписание
idstringУникальный id
messagestring | VNodeСодержимое тоста
optionsToastOptions (обязательно)Объединённые опции
createdAtnumberDate.now() в момент создания
remainingRef<number>0–1, доля оставшегося времени таймера
isPausedRef<boolean>Таймер на паузе
groupCountRef<number>Обычно 1; >1, когда активна группировка
pause()() → voidПоставить таймер на паузу
resume()() → voidВозобновить таймер
dismiss()() → voidЗакрыть тост
update(opts)(Partial<ToastOptions>) → voidСлить новые опции

createToastContext — мульти-инстансы

Создаёт изолированный экземпляр очереди. Передайте его в useToast(ctx) и <ToastContainer :context="ctx" />, чтобы полностью отделить область уведомлений от глобальной.

ts
const ctx = createToastContext(options?: GlobalToastOptions): ToastContext

Сценарии использования:

  • Оболочки микрофронтендов, где каждый MFE управляет своими уведомлениями
  • Модальные диалоги с локальными статус-тостами, которые не должны пересекаться с очередью уровня приложения
  • Несколько отдельных зон уведомлений на одной странице

Пример

vue
<script setup lang="ts">
import { createToastContext, useToast, ToastContainer } from 'vue-toast-kit'

const modalCtx = createToastContext({ maxVisible: 3 })
const modalToast = useToast(modalCtx)

function save() {
  modalToast.success('Changes saved inside the modal')
}
</script>

<template>
  <div class="modal">
    <button @click="save">Save</button>

    <!-- Этот контейнер показывает только тосты из modalCtx -->
    <ToastContainer :context="modalCtx" position="top-right" :z-index="10001" />
  </div>
</template>