Skip to content
API 风格:

Message (глобальное сообщение) ​

Глобальная лёгкая обратная связь, обычно используется для однократного уведомления о результате операции. Основной API — императивный сервис (LhMessage.success(...)): очередь рендерится в отдельном контейнере, не зависит от дерева компонентов, при превышении лимита наиболее старое сообщение автоматически удаляется.

Базовое использование ​

Базовое использование
vue
<script setup lang="ts">
import { LhMessage } from '@lh-ui/vue3'

const showBasic = () => {
  LhMessage('Это сообщение-подсказка')
}
</script>

<template>
  <LhButton @click="showBasic">Показать сообщение</LhButton>
</template>
vue
<script>
import { LhMessage } from '@lh-ui/vue3'

export default {
  methods: {
    showBasic() {
      LhMessage('Это сообщение-подсказка')
    },
  },
}
</script>

<template>
  <LhButton @click="showBasic">Показать сообщение</LhButton>
</template>

Семантические типы ​

Четыре семантических типа + loading; warning / danger / error объявляются немедленно с role="alert", остальные — мягко.

Четыре семантических типа и loading
vue
<script setup lang="ts">
import { LhMessage } from '@lh-ui/vue3'

const showInfo = () => LhMessage.info('Информационное сообщение')
const showSuccess = () => LhMessage.success('Сохранено успешно')
const showWarning = () => LhMessage.warning('Обратите внимание на риск')
const showDanger = () => LhMessage.danger('Операция не удалась')
// loading по умолчанию не закрывается автоматически —
// закрытие выполняется через возвращаемый дескриптор
const showLoading = () => {
  const handle = LhMessage.loading('Идёт синхронизация…')
  setTimeout(() => handle.close(), 2000)
}
</script>

<template>
  <div class="demo-message-row">
    <LhButton @click="showInfo">Информация</LhButton>
    <LhButton @click="showSuccess">Успех</LhButton>
    <LhButton @click="showWarning">Предупреждение</LhButton>
    <LhButton @click="showDanger">Опасность</LhButton>
    <LhButton @click="showLoading">Загрузка (закрытие вручную)</LhButton>
  </div>
</template>
vue
<script>
import { LhMessage } from '@lh-ui/vue3'

export default {
  methods: {
    showInfo() {
      LhMessage.info('Информационное сообщение')
    },
    showSuccess() {
      LhMessage.success('Сохранено успешно')
    },
    showWarning() {
      LhMessage.warning('Обратите внимание на риск')
    },
    showDanger() {
      LhMessage.danger('Операция не удалась')
    },
    // loading по умолчанию не закрывается автоматически —
    // закрытие выполняется через возвращаемый дескриптор
    showLoading() {
      const handle = LhMessage.loading('Идёт синхронизация…')
      setTimeout(() => handle.close(), 2000)
    },
  },
}
</script>

<template>
  <div class="demo-message-row">
    <LhButton @click="showInfo">Информация</LhButton>
    <LhButton @click="showSuccess">Успех</LhButton>
    <LhButton @click="showWarning">Предупреждение</LhButton>
    <LhButton @click="showDanger">Опасность</LhButton>
    <LhButton @click="showLoading">Загрузка (закрытие вручную)</LhButton>
  </div>
</template>

Закрываемость и лимит очереди ​

showClose показывает кнопку закрытия; по умолчанию в очереди максимум 5 сообщений (настраивается через LhMessage.config({ max })), при превышении удаляется самое старое.

Закрываемость
vue
<script setup lang="ts">
import { LhMessage } from '@lh-ui/vue3'

const showClosable = () => LhMessage.success('Сохранено успешно', { showClose: true })
// closeLabel задаёт доступное имя кнопки закрытия
const showCloseLabel = () => LhMessage.info('Проверьте входящие', { showClose: true, closeLabel: 'Понятно, закрыть' })
</script>

<template>
  <LhButton @click="showClosable">Ручное закрытие</LhButton>
  <LhButton @click="showCloseLabel">Свой текст закрытия</LhButton>
</template>
vue
<script>
import { LhMessage } from '@lh-ui/vue3'

export default {
  methods: {
    showClosable() {
      LhMessage.success('Сохранено успешно', { showClose: true })
    },
    // closeLabel задаёт доступное имя кнопки закрытия
    showCloseLabel() {
      LhMessage.info('Проверьте входящие', { showClose: true, closeLabel: 'Понятно, закрыть' })
    },
  },
}
</script>

<template>
  <LhButton @click="showClosable">Ручное закрытие</LhButton>
  <LhButton @click="showCloseLabel">Свой текст закрытия</LhButton>
</template>

Глобальная конфигурация ​

ts
import { LhMessage } from '@lh-ui/vue3'

LhMessage.config({
  duration: 3000, // мс до автоматического закрытия (0 — не закрывать)
  max: 5,         // максимальное количество одновременно отображаемых сообщений
  offset: 20,     // отступ от верхней границы viewport, px
  appendTo: 'body', // контейнер монтирования (селектор или элемент)
})

API ​

LhMessage Props ​

СвойствоОписаниеТипПо умолчанию
contentСодержимое сообщенияstring—
typeСемантический тип"success" | "warning" | "error" | "info" | "danger" | "loading"'info'
showCloseПоказывать ли кнопку закрытияbooleanfalse
closeLabelДоступное имя кнопки закрытия (если не передано, берётся из языкового пакета message.close)string—
sxСвойства быстрой разметки sxLhSxProps—

Сервисные методы: LhMessage(options) / LhMessage.success/info/warning/danger/loading(content, options?), возвращают дескриптор { close }; также есть LhMessage.close(id), LhMessage.closeAll() и LhMessage.config(options).

Events ​

СобытиеОписаниеПараметры обратного вызова
closeСрабатывает при нажатии на кнопку закрытия в сообщении—

В императивном варианте закрытие (как автоматическое, так и ручное) отслеживается через коллбэк onClose в Options.

Options ​

СвойствоОписаниеТипПо умолчанию
contentСодержимое сообщенияstring—
typeСемантический тип'info' | 'success' | 'warning' | 'danger' | 'error' | 'loading''info'
durationМс до автоматического закрытия, 0 — не закрывать (для loading по умолчанию 0)number3000
showCloseПоказывать ли кнопку закрытияbooleanfalse
offsetОтступ от верхней границы viewport, pxnumber20
sxСвойства быстрой разметки sxLhSxProps—
onCloseКоллбэк после закрытия() => void—

Доступность ​

  • Контейнер и сообщения являются live region: info / success / loading мягко объявляются через role="status", warning / danger / error — немедленно через role="alert"
  • Не блокирующий дизайн: фокус не перехватывается, поток клавиатурной навигации не перекрывается
  • Кнопка закрытия содержит aria-label (языковой пакет message.close, можно переопределить через closeLabel)
  • Анимация уважает prefers-reduced-motion

Определения типов ​

Структуры TypeScript, экспортируемые этим компонентом (автоматически извлечены из packages/components/message/src/types.ts и исходников @lh-ui/share/core/*; нажмите на каждый пункт, чтобы развернуть полное определение; описания свойств см. в таблице Props выше):

LhMessageOptions
ts
/** Параметры сервиса: строковое содержимое + отображение и коллбэки */
export interface LhMessageOptions {
  /** Содержимое сообщения */
  content: string
  /** Семантический тип, по умолчанию info */
  type?: LhMessageType
  /** Мс до автоматического закрытия, 0 — не закрывать (для loading по умолчанию 0, для остальных 3000) */
  duration?: number
  /** Показывать ли кнопку закрытия */
  showClose?: boolean
  /** Отступ от верхней границы viewport, px (по умолчанию 20) */
  offset?: number
  /** Свойства быстрой разметки sx */
  sx?: LhSxProps
  /** Коллбэк после закрытия (как автоматического, так и ручного) */
  onClose?: () => void
}
LhMessageHandle
ts
/** Дескриптор сервиса */
export interface LhMessageHandle {
  close: () => void
}
LhMessageProps
ts
/** Props компонента сообщения (рендерится внутри сервиса; можно использовать и декларативно) */
export interface LhMessageProps {
  content: string
  type?: LhMessageType
  showClose?: boolean
  /** Доступное имя кнопки закрытия (если не передано, берётся из языкового пакета message.close) */
  closeLabel?: string
  sx?: LhSxProps
}
LhMessageConfig
ts
/** Параметры глобальных значений по умолчанию (LhMessage.config) */
export interface LhMessageConfig {
  duration?: number
  max?: number
  offset?: number
  /** Контейнер монтирования (по умолчанию body) */
  appendTo?: string | HTMLElement
}
LhMessageType (из @lh-ui/share/core/message)
ts
/** Семантический тип сообщения (четыре семантики + loading) */
export type LhMessageType =
  | (typeof LH_MESSAGE_TYPE_CONST)[keyof typeof LH_MESSAGE_TYPE_CONST]
LhMessageRecord (из @lh-ui/share/core/message)
ts
/** Форма записи отдельного сообщения в очереди сервиса */
export interface LhMessageRecord {
  id: number
  type: LhMessageType
  content: string
  /** Мс до автоматического закрытия, 0 — не закрывать */
  duration: number
  showClose: boolean
  /** Отступ от верхней границы viewport, px */
  offset: number
  sx?: LhSxProps
  onClose?: () => void
}

Константы ​

Публичные константы, используемые этим компонентом (в столбцах «Тип / По умолчанию» таблицы Props можно перейти к одноимённой записи):

LH_MESSAGE_TYPE_CONST (из @lh-ui/share/core/message)
ts
/** Константа типов (добавляет loading к общим семантическим константам) */
export const LH_MESSAGE_TYPE_CONST = {
  ...LH_TYPES_CONST,
  /** @alias загрузка */
  loading: 'loading',
} as const
LH_MESSAGE_DURATION_DEFAULT (из @lh-ui/share/core/message)
ts
/** Длительность автоматического закрытия по умолчанию (семантика loading не закрывается автоматически) */
export const LH_MESSAGE_DURATION_DEFAULT = 3000
LH_MESSAGE_MAX_DEFAULT (из @lh-ui/share/core/message)
ts
/** Максимальное количество одновременно отображаемых сообщений; при превышении удаляется самое старое */
export const LH_MESSAGE_MAX_DEFAULT = 5
LH_MESSAGE_OFFSET_DEFAULT (из @lh-ui/share/core/message)
ts
/** Отступ от верхней границы viewport по умолчанию, px */
export const LH_MESSAGE_OFFSET_DEFAULT = 20

Красота традиций — основа кода