Skip to content

useToast, toast.promise и toast.undo

useToast

Основной composable. Возвращает объект ToastApi. Работает внутри и вне компонентов Vue.

ts
const toast = useToast(context?: ToastContext): ToastApi

При вызове без аргументов внутри компонента используется внедрённый контекст (настроенный плагином). При вызове вне компонента используется глобальный синглтон. Передайте ToastContext из createToastContext() для использования изолированной очереди.

Методы

МетодСигнатураОписание
toast()(message, options?) → idПоказать тост типа info
toast.success()(message, options?) → idПоказать тост типа success
toast.error()(message, options?) → idПоказать тост типа error (приоритет high по умолчанию)
toast.warning()(message, options?) → idПоказать тост типа warning
toast.info()(message, options?) → idПоказать тост типа info
toast.loading()(message, options?) → idПоказать тост типа loading (без авто-закрытия, по умолчанию не закрывается)
toast.custom()(component, options?) → idЗаменить тело тоста компонентом Vue
toast.promise()(promise, messages, options?) → PromiseСм. toast.promise
toast.undo()(message, options) → idСм. toast.undo
toast.update()(id, partial) → voidСлить опции (и опционально сообщение) в существующий тост
toast.updateMessage()(id, message) → voidОбновить только текст сообщения, не трогая опции
toast.dismiss()(id?) → voidЗакрыть тост по id; без id закрывает все
toast.dismissAll()(position?) → voidЗакрыть все тосты, опционально с фильтром по позиции
toast.isActive()(id) → booleanПроверить, виден ли ещё тост
toast.pauseAll()() → voidПоставить на паузу все таймеры
toast.resumeAll()() → voidВозобновить все таймеры

ToastOptions

ОпцияТипПо умолчаниюОписание
idstringавтоУникальный id; если тост с таким id уже активен, он обновляется
typeToastType'info'Визуальный стиль; один из info / success / warning / error / loading / custom
priorityToastPriority'normal'Приоритет в очереди; один из critical / high / normal / low
durationnumber4000Задержка авто-закрытия в мс; 0 = не закрывается сам
positionToastPositionпозиция контейнераОтрендерить этот тост в конкретной позиции, независимо от пропа position контейнера
closablebooleantrueПоказывать кнопку закрытия
groupKeystringГруппировать тосты с одинаковым ключом в стек
iconComponent | string | falseпо умолчанию для типаSVG-компонент, строка эмодзи или false, чтобы скрыть
action{ label, onClick }Дополнительная кнопка действия внутри тоста
undo{ label?, onUndo, duration? }Кнопка отмены с таймером; см. toast.undo
onClose() => voidВызывается при закрытии тоста (по любой причине)
onAutoClose() => voidВызывается только при истечении таймера
pauseOnHoverbooleantrueСтавить таймер на паузу при наведении курсора
pauseOnFocusLossbooleantrueСтавить таймер на паузу, когда вкладка уходит в фон
swipeToDismissbooleantrueРазрешить свайп влево / вправо для закрытия на сенсорных устройствах
persistbooleanfalseВосстанавливать из localStorage после перезагрузки (только для тостов без коллбэков)
componentComponentЗаменить всё тело тоста компонентом Vue
componentPropsRecord<string, unknown>Пропы, передаваемые в component
ariaLive'assertive' | 'polite'автоПереопределить автоматическое значение aria-live
theme'light' | 'dark' | 'system' | ToastDesignTokensТема или переопределение токенов для конкретного тоста

Примеры

Все типы тостов:

ts
toast.info('Sync complete')
toast.success('File uploaded')
toast.warning('Disk almost full (92 %)')
toast.error('Connection refused')
toast.loading('Fetching data…')

Кастомная длительность и позиция:

ts
toast.success('Copied to clipboard', {
  duration: 2000,
  position: 'top-center',
})

С кнопкой действия:

ts
toast.info('New message from Alex', {
  action: {
    label: 'Open',
    onClick: () => router.push('/messages'),
  },
})

Иконка-эмодзи:

ts
toast.success('Backup complete', { icon: '💾' })

Не закрывается сам до ручного закрытия:

ts
const id = toast.error('Server is down', { duration: 0, closable: true })
// Позже:
toast.dismiss(id)

Обновление существующего тоста:

ts
const id = toast.loading('Uploading…')
// Обновить только сообщение (без изменения опций):
toast.updateMessage(id, 'Processing…')
// Или обновить сообщение + опции вместе:
toast.update(id, { message: 'Almost done…', duration: 3000 })

Насыщенный контент через компонент Vue:

ts
import RichCard from './RichCard.vue'

toast.custom(RichCard, {
  componentProps: { title: 'Hello', body: 'World' },
  duration: 0,
  closable: true,
})

toast.promise

Автоматически переключает тост loading на success или error в зависимости от результата промиса. Возвращает исходный промис, чтобы вы могли сделать await.

ts
toast.promise<T>(
  promise: Promise<T>,
  messages: PromiseToastMessages<T>,
  options?: ToastOptions,
): Promise<T>

PromiseToastMessages

ПолеТипОписание
loadingstringСообщение, пока промис ожидает выполнения
successstring | (data: T) => stringСообщение при разрешении; получает разрешённое значение
errorstring | (err: unknown) => stringСообщение при отклонении; получает ошибку

Примеры

Статические сообщения:

ts
await toast.promise(
  fetch('/api/deploy').then((r) => r.json()),
  {
    loading: 'Deploying…',
    success: 'Deployed successfully!',
    error: 'Deployment failed',
  },
)

Динамические сообщения из данных / ошибки:

ts
const user = await toast.promise(fetchUser(id), {
  loading: 'Loading user…',
  success: (u) => `Welcome, ${u.name}!`,
  error: (e) => `Could not load user: ${(e as Error).message}`,
})

В действии Pinia:

ts
// stores/files.ts
import { toast } from 'vue-toast-kit'

export const useFileStore = defineStore('files', {
  actions: {
    async upload(file: File) {
      return toast.promise(uploadAPI(file), {
        loading: `Uploading ${file.name}…`,
        success: (res) => `${res.name} uploaded (${res.size} KB)`,
        error: (e) => `Upload failed: ${(e as Error).message}`,
      })
    },
  },
})

reject промиса выбрасывается заново после обновления тоста, так что ваш try / catch или .catch() по-прежнему срабатывает нормально.

toast.undo

Создаёт тост со счётчиком обратного отсчёта в виде прогресс-бара. Когда пользователь кликает по кнопке отмены, вызывается onUndo(), и тост немедленно закрывается. Когда таймер истекает, тост закрывается молча (действие подтверждено).

ts
toast.undo(message: string, options: ToastOptions & {
  undo: {
    onUndo: () => void | Promise<void>
    label?:   string   // default: 'Отменить'
    duration?: number  // ms, default: 5000
  }
}): string

Примеры

Удаление с отменой:

ts
function deleteFile(id: string) {
  markForDeletion(id)

  toast.undo(`File "${fileName}" deleted`, {
    undo: {
      label: 'Restore',
      duration: 6000,
      onUndo: () => {
        restoreFile(id)
        toast.success('File restored')
      },
    },
    onAutoClose: () => permanentlyDelete(id),
  })
}

Архивирование письма:

ts
toast.undo('Email archived', {
  icon: '📨',
  undo: {
    onUndo: () => moveToInbox(emailId),
  },
})

Асинхронная отмена:

ts
toast.undo('Record deleted', {
  undo: {
    onUndo: async () => {
      await api.restore(recordId)
      toast.success('Record restored!')
    },
  },
})