메인 콘텐츠로 건너뛰기

자주 묻는 질문

왜 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가 두 개의 매개변수인가요​

(value, event)의 2-매개변수 설계는 lh-ui-plus의 emit('change', [val, e])와 동일한 구조로, Vue에서 마이그레이션하기 편하고 네이티브 이벤트를 가져올 수도 있습니다.

오버레이 위치 계산에 floating-ui를 쓰지 않는 이유는 무엇인가요​

패밀리 red line: 오버레이 지오메트리 계산이 @lh-ui/share/core/shared/popper에 구현되어 있고, 각 플랫폼이 동일한 로직과 경계 처리(뒤집기, 넘침 시 접기, 화살표)를 공유합니다. 서드파티 라이브러리를 도입하면 플랫폼 간 동작이 어긋나게 됩니다.

전환 애니메이션에 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는 하나만 닫나요​

useLhOverlayStack가 열린 순서 스택을 유지하고, Esc는 최상단 오버레이만 닫습니다. 이는 APG dialog pattern의 요구 사항으로, 한 번의 키 입력에 모든 오버레이가 함께 닫히는 것을 막습니다.

명령형 서비스가 여러 React root를 만들지는 않나요​

아니요. message 등의 서비스는 하나의 지연 생성된 싱글톤 컨테이너 root를 공유합니다. 첫 호출 시에야 생성되어 body에 append되고, 컴포넌트 내부 state가 메시지 큐를 관리합니다. destroyContainer()는 명시적으로 root.unmount()합니다.

SSR에서 message를 호출하면 어떻게 되나요​

개발 경고 하나만 출력하고 no-op하며, DOM을 생성하지 않습니다. DOM 조작은 모두 useEffect / useIsomorphicLayoutEffect 내부에 있고, useLhLocale은 useSyncExternalStore로 일관된 SSR 스냅샷을 제공합니다.

왜 forwardRef가 필요한가요? ref prop을 직접 쓰면 안 되나요​

React 18과 19 두 버전을 지원하기 때문입니다. React 19의 ref-as-prop은 18에 존재하지 않으며, forwardRef는 두 버전 모두의 상위 집합입니다. 포커스 가능 컴포넌트(button / input / select / dialog / tooltip)는 모두 ref를 전달합니다.

lh-ui-plus와 같은 프로젝트에서 함께 쓸 수 있나요​

네, 두 라이브러리의 클래스명과 토큰이 완전히 일치해 스타일이 충돌하지 않습니다. 하지만 보통은 필요 없습니다 — 둘은 같은 컴포넌트들의 두 가지 프레임 형태입니다. 점진적 마이그레이션 시나리오에서 섞어 쓸 경우, 두 라이브러리의 @lh-ui/share 버전 범위가 서로 호환되어야 합니다.

초판에 구현되지 않은 것은 무엇인가요​

P1/P2 컴포넌트(Popover, Drawer, Dropdown, Table 등)가 구현되지 않았습니다. 세 개의 명령형 서비스(message / notification / loading)는 모두 완전히 구현되어 있습니다.