Next13에서 작업하며 고민한 흔적..(next가 아니어도 활용 가능)
그동안 모달을 작업 할 때에는 페이지 내에서 모달을 열고 닫고 할 일만 있었다.
이번 작업에선 로그인을 공통헤더에서 모달형식으로 띄워주기를 하면서 어떻게 구현을 할지 고민이 많았다.
next13에서 제공하고있는 Parallel Routes와 Intercepting Routes를 사용하면 페이지이동처럼 히스토리에 '/login' 패스 추가하여 사용할 수 있다고 하여 작업을 해 보았다.
그 결과.. 홈(패스 = '/')에서만 보여지는 header스타일이 있는데 패스가 '/'에서 '/login' 으로 바뀌다 보니 서브 header스타일로 적용이 되면서 홈에서 모달이 열리고 닫힐 때 뒤에 보이는 페이지 레이아웃이 무너지게 되었다.
어느 페이지에서나 모달을 열 수 있는것이기 때문에 패스로 처리하는건 적합하지 않다고 생각하여 다른방법을 찾아보았다.
혹시나 헤더에서 로그인버튼 클릭이 아닌 다른 경로로 로그인을 띄워야 할 경우가 있다면, 현재 헤더컴포넌트 안에 있는 로그인 모달을 제어하기위해 상태관리를 사용해야 하거나 또다른 처리를 해줘야 할 것 같았다.
그렇지만 쿼리를 사용한다면 어디서든 모달쿼리값을 push()해주면 헤더에서 바뀐 쿼리에 대한 처리를 해서 모달을 띄워 주지 않을까?
'modal'이란 쿼리 키로 모달을 제어 하였고, 쿼리의 유무로 열고닫기만 하는 것이 아닌 특정 모달이 열릴 수 있도록 해주었다.
(로그인 모달 내에서 회원가입 / 비번찾기 버튼을 누르면 해당 모달을 보여줘야했다.)
import { useRouter, useSearchParams, usePathname } from "next/navigation";
const router = useRouter();
const searchParams = useSearchParams();
const pathname = usePathname();
히스토리를 조작한다.
const handleOpenMadal = (name: string) => {
router.push(`${pathname}?modal=${name}`);
};
혹시나 나중에 재사용 하거나 모달내에서 다른 모달을 열었을 경우 순차적으로 뒤로 가야한다면 히스토리를 쌓아야 하기때문에 name을 받아 사용했다.
const handleCloseMadal = () => {
router.back();
};
const handleChangeModal = (name: string) => {
if (pathname === null) return;
router.replace(`${pathname}?modal=${name}`);
};
로그인 > 회원가입 > 로그인 왔다갔다 해도 뒤로가기 한번이면 모달 닫힘
현재 히스토리의 쿼리에 대한 모달상태를 보여준다.
const isModal = searchParams?.get("modal");
return (
// ...
{isModal && (
<Modal>
{isModal === "로그인" && <로그인 />}
{isModal === "회원가입" && <회원가입 />}
{isModal === "비번찾기" && <비번찾기 />}
</Modal>
)}
)
isModal : 'modal'이라는 쿼리키에대한 유무와 값
여기서 isModal의 타입은 string | null | undefined
이 된다.
공부하며 정리&기록하는 ._. 씅로그