よくある質問
app.use() のようなインストール機構がないのはなぜですか
React には Vue のようなプラグイン機構がありません。@lh-ui/react はすべて名前付きエクスポートで、必要なものをオンデマンドにインポートするだけで済み、tree-shaking にも有利です。グローバル 設定は LhConfigProvider コンポーネントでラップします。
スタイルが自動的に注入されないのはなぜですか
@lh-ui/vue2 と揃えたオンデマンド方針です:パッケージのエントリは全量スタイルの side-effect を注入せず、ユーザーが明示的に @lh-ui/react/theme.css と @lh-ui/react/style/<name> を導入します。理由は、React エコシステムではオンデマンドインポートが主流であり、全量 side-effect は tree-shaking を損なうためです。
onChange が 2 つの引数なのはなぜですか
(value, event) の 2 引数設計は lh-ui-plus の emit('change', [val, e]) と同型で、Vue からの移行しやすさと、ネイティブイベントを取得できることの両方を保ちます。
オーバーレイの配置に floating-ui を使わないのはなぜですか
ファミリーの红线です:オーバーレイの幾何計算は @lh-ui/share/core/shared/popper 内に実装され、各端が同じロジックと境界処理(反転、はみ出し時の折りたたみ、矢印)を共有します。サードパーティライブラリを導入すると各端で挙動の drift が生じます。
トランジションに react-transition-group を使わないのはなぜですか
同じ理由です。useTransition は本ライブラリの自研する mounted + phase のステートマシンで、クラス名は share SCSS と完全に一致し(*-enter-from / *-enter-active / *-enter-to)、StrictMode 下でも安全です。
Dialog が純粋な制御なのはなぜですか
open は完全に外部 state が保持し、すべ ての閉じるパス(マスククリック / Esc / 閉じるボタン)は onClose しか呼びません。lh-ui-plus は内部に isVisible 中間状態 + watch による双方向同期を持ちますが、React 版はこの層を取り除きました:制御のセマンティクスがより純粋で、props と内部状態の競合も避けられます。
複数の Dialog を同時に開いた時、Esc が 1 つしか閉じないのはなぜですか
useLhOverlayStack が開いた順のスタックを管理し、Esc はスタック最上位のオーバーレイだけを閉じます。これは APG dialog pattern の要件で、一度のキー操作で全オーバーレイを持っていかれるのを防ぎます。
命令的サービスは複数の React root を作成しますか
いいえ。message などのサービスは遅延生成される単一の単例コンテナ root を共有し、最初の呼び出しで初めて作成して body に append します。コンポーネント内部の state がメッセージキューを管理します。destroyContainer() が明示的に root.unmount() します。
SSR の中で message を呼ぶとどうなりますか
開発時の警告を 1 つ出力するだけで no-op になり、DOM は作成しません。DOM 操作はすべて useEffect / useIsomorphicLayoutEffect の内で行われ、useLhLocale は useSyncExternalStore で一貫した SSR スナップショットを提供します。
なぜ ref prop ではなく forwardRef が必要なのですか
React 18 と 19 の両バージョンをサポートするためです。React 19 の ref-as-prop は 18 には存在せず、forwardRef が両バージョンに共通の上位集合になります。フォーカス可能なコンポーネント(button / input / select / dialog / tooltip)はすべて ref を転送します。
lh-ui-plus と同一プロジェクトで併用できますか
できます。両者はクラス名とトークンが完全に一致し、スタイルが衝突することはありません。ただし通常は不要です —— 両者は同一のコンポーネント群の 2 つのフレームワーク形態です。漸進的移行の場面で混用する場合、2 つのライブラリの @lh-ui/share のバージョン範囲が互換であることに注意してください。
初期リリースに含まれていないものは何ですか
P1/P2 コンポーネント(Popover、Drawer、Dropdown、Table など)は未実装です。3 つの命令的サービス
(message / notification / loading)はすべて完全に実装されています。