Перейти к основному содержимому

Часто задаваемые вопросы

Почему нет механизма установки app.use()​

У React нет подключаемой системы, как у Vue. Всё в @lh-ui/react — именованный экспорт, подключаемый по необходимости, что также дружелюбнее к tree-shaking. Глобальная настройка делается через оборачивание в компонент LhConfigProvider.

Почему стили не подключаются автоматически​

Стратегия подключения по требованию, выровненная с @lh-ui/vue2: вход пакета не внедряет побочный эффект полного подключения стилей; пользователь явно импортирует @lh-ui/react/theme.css и @lh-ui/react/style/<name>. Причина в том, что в экосистеме React импорт по требованию является основным подходом, а полный побочный эффект сломал бы tree-shaking.

Почему onChange принимает два аргумента​

Двухаргументная конструкция (value, event) изоморфна emit('change', [val, e]) из lh-ui-plus: это упрощает миграцию с Vue и сохраняет возможность получить нативное событие.

Почему для позиционирования оверлеев не используется floating-ui​

Красная линия семейства: геометрия оверлеев реализована в @lh-ui/share/core/shared/popper, и все платформы разделяют одну логику и обработку краевых случаев (переворот, свёртывание при переполнении, стрелки). Подключение сторонней библиотеки привело бы к расхождению поведения между платформами.

Почему для переходов не используется react-transition-group​

По той же причине. useTransition — собственная машина состояний mounted + phase, имена классов которой в точности совпадают со SCSS из share (*-enter-from / *-enter-active / *-enter-to), и она безопасна в StrictMode.

Почему Dialog полностью контролируемый​

open полностью принадлежит внешнему state; любой путь закрытия (клик по маске / Esc / кнопка закрытия) лишь вызывает onClose. В lh-ui-plus есть внутреннее промежуточное состояние isVisible с двусторонней синхронизацией через watch; в версии React этот слой убран: контролируемая семантика чище, а гонка между props и внутренним состоянием исключена.

Когда открыто несколько Dialog, почему Esc закрывает только один​

useLhOverlayStack поддерживает стек порядка открытия; Esc закрывает только верхний оверлей. Так требует шаблон APG dialog pattern, чтобы одно нажатие не закрывало все оверлеи разом.

Создают ли императивные сервисы несколько React root​

Нет. Сервисы вроде message разделяют один лениво создаваемый root-контейнер-одиночка: он создаётся при первом вызове, добавляется в body, а внутреннее состояние компонента управляет очередью сообщений. destroyContainer() явно вызывает root.unmount().

Что произойдёт, если вызвать message во время SSR​

Только запишется предупреждение разработки и произойдёт no-op, без создания DOM. Все DOM-операции выполняются внутри useEffect / useIsomorphicLayoutEffect, а useLhLocale предоставляет согласованный SSR-снимок через useSyncExternalStore.

Почему используется forwardRef, а не просто ref prop​

Поддерживаются обе версии: React 18 и 19. ref-as-prop из React 19 не существует в 18, а forwardRef является общим надмножеством для обеих версий. Элементы, доступные для фокуса (button / input / select / dialog / tooltip), прокидывают ref.

Можно ли использовать вместе с lh-ui-plus в одном проекте​

Да — имена классов и токены у них полностью совпадают, стили не конфликтуют. Обычно в этом нет необходимости, поскольку это две фреймворк-формы одного и того же набора компонентов. Если вы смешиваете их при постепенной миграции, следите, чтобы диапазоны версий @lh-ui/share у двух библиотек были совместимы.

Что не реализовано в первом выпуске​

Компоненты P1/P2 (Popover, Drawer, Dropdown, Table и др.) не реализованы. Три императивных сервиса (message / notification / loading) реализованы полностью.