Dialog 구현/login → <LoginDialog /> 렌더링/login으로 이동하여 다이얼로그처럼 보이게 처리함useLocation()에서 state와 search 등을 통해 데이터 넘겨줌navigate('/login', {
state: { someData },
search: '?mode=fast'
});
DialogRenderer 도입DialogRenderer 컴포넌트를 만듦pathname에 따라 dialogMap에서 컴포넌트를 가져와 동적으로 렌더링함const dialogMap = {
'/login': {
component: LoginDialog
}
}
dialogMap 확장onConfirm 핸들러를 설정할 수 있도록 구조 확장함'/login': {
component: LoginDialog,
onConfirm: (data) => { ... }
}
DialogProps<T> 제네릭 정의onConfirm: (data: T) => void 형태로 선언함export interface DialogProps<T> {
open: boolean;
onClose: () => void;
onConfirm: (data: T) => void;
state?: any;
query?: URLSearchParams;
}
ConfirmHandlers / DialogDataMap 분리type DialogDataMap = {
'/login': { email: string; password: string };
'/invite': { userId: string; step: number };
}
type ConfirmHandlers = {
[P in keyof DialogDataMap]: (data: DialogDataMap[P]) => void;
}
handleConfirm을 타입 추론 기반으로 작성함typeof path를 기반으로 현재 다이얼로그의 인자 타입 추출type confirmArg = DialogDataMap[typeof path];
data를 그대로 confirmHandler?.(data)로 전달함DialogRenderer는 다음을 처리함:
다이얼로그 추가 시에는 dialogMap에만 등록하면 됨
다이얼로그 내부에서는 props.onConfirm?.({ ... }) 호출하면 됨
다이얼로그에 외부 데이터를 넘길 때 navigate()의 state와 search를 활용함
navigate('/login', {
state: { from: 'homepage' },
search: '?redirect=dashboard'
});
const { pathname, search, state } = useLocation();
const query = new URLSearchParams(search);
state는 navigate로 넘긴 임의의 객체query는 URLSearchParams를 이용해 문자열 파싱된 쿼리 객체<DialogComponent
open={open}
onClose={handleClose}
onConfirm={handleConfirm}
state={state} // 전달된 state 그대로 넘김
query={query} // URLSearchParams로 파싱된 쿼리 객체