Часто задаваемые вопросы
Почему нет механизма установки 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().