-
Notifications
You must be signed in to change notification settings - Fork 2
컴포넌트 동시에 띄우기
jw0097 edited this page Aug 25, 2024
·
1 revision
-
url을 변경하면서 modal을 띄우는 동시에 이전 화면을 뒷 배경으로 보여주려고 하였다. 다음과 같은 블로그를 참고했다.
-
useLocation
-
모달 띄우기
이 상황은 사용자가 웹사이트를 처음 방문하거나, 특정 URL(예: /modal
)로 직접 접근했을 때 발생한다. 이 경우 background
는 null
또는 undefined
이고, location
이 현재 위치를 나타내므로, location={background || location}
는 단순히 location={location}
과 동일하게 동작한다.
-
사용자가
/
로 접근할 때:-
location.pathname
은/
이다. -
Routes
는 이 경로에 매칭되는<Route>
를 찾고,path="/"
를 가진Main
컴포넌트를 렌더링한다. - 이때,
Modal
컴포넌트는 렌더링되지 않는다(경로가/modal
이 아니기 때문에).
-
-
사용자가
/modal
로 직접 접근할 때:-
location.pathname
은/modal
이다. -
Routes
는 이 경로에 매칭되는<Route>
를 찾는다./
경로에 있는Main
컴포넌트가 먼저 렌더링되고,Outlet
을 통해modal
경로에 있는Modal
컴포넌트가 렌더링된다. - 이 경우,
Main
컴포넌트가 유지되면서Modal
컴포넌트가 그 위에 중첩되어 렌더링된다.
-
이 상황은 사용자가 모달을 열기 위해 특정 버튼을 클릭했을 때 발생한다. 이 경우 background
에는 모달을 열기 전에 사용자가 있던 위치 정보가 저장되어 있다. React Router는 이 background
를 이용해 현재 위치를 모달이 열리기 전의 상태로 간주하게 된다.
-
사용자가
/
에서 모달을 열려고 할 때:- 사용자가
/
페이지에서 "Open Modal" 링크를 클릭하면,Link
컴포넌트의state={{ background: location }}
덕분에 현재 위치(/
)가background
에 저장된다. - 이때 URL은
/modal
로 바뀐다. -
location={background || location}
에 의해, 첫 번째<Routes>
는background
(즉,/
)을 위치로 인식하게 된다. - 따라서
Routes
는/
경로와 매칭되는Main
컴포넌트를 렌더링한다. 즉, 모달이 열려 있어도 배경으로/
페이지가 유지된다. - 그러나 URL이
/modal
로 설정되어 있기 때문에,background
가 존재할 경우 두 번째<Routes>
가 활성화되어 모달이 페이지 위에 오버레이되어 렌더링된다.
- 사용자가
-
모달을 열 때의 동작:
- 첫 번째
<Routes>
는 여전히 이전 위치인/
를 기준으로 라우팅을 처리하므로, 페이지는 계속해서Main
컴포넌트를 렌더링한다. - 동시에 두 번째
<Routes>
가 실행되며, 오직modal
경로만을 기준으로 모달을 렌더링한다. - 따라서 사용자는 모달이 열려 있는 동안에도 기존 페이지(홈페이지)를 볼 수 있다.
- 첫 번째
-
우리 앱은 /auth-modal로 직접 전달했을 때에는 뒤에 따른 배경을 보여줄 필요가 없다. 오직 어떤 페이지에서 모달을 열었을 때(background가 존재할 때)만 뒷 배경을 보여주면 된다.
-
따라서 예제의 코드를 빌려 표시하면 다음과 같이 router가 설정되면 된다.
import "./App.css";
import { Route, Routes, useLocation } from "react-router-dom";
import { Main } from "./components/Main";
import { Modal } from "./components/Modal";
function App() {
const location = useLocation();
const background = location.state && location.state.background;
return (
<div className="App">
<Routes location={background || location}>
<Route path="/" element={<Main />} />
<Route path="modal" element={<Modal />} />
</Routes>
{background && (
<Routes>
<Route path="modal" element={<Modal />} />
</Routes>
)}
</div>
);
}
export default App;
- 백그라운드가 존재하지 않을 때:
- 사용자가
/
로 접근할 때:Main
컴포넌트를 보여준다. - 샤용자가
/modal
로 접근할 때:Modal
컴포넌트를 보여준다.
- 사용자가
- 백그라운드가 존재할 때(사용자가 어떤 페이지에서 모달을 열었을 때):
- 사용자가
/
에서 모달을 열려고 할 때: 첫 번째Routes
에서 location이 background가 되므로 background를 보여준다. background가 있으므로 두 번째Routes
가 활성화되고 여기서는 location이 현재 location(/modal)이므로 modal도 렌더링 된다.
- 사용자가
- 하지만 createBrowserRouter에서 동적으로 location을 넘길 수 있는 방법이 없는 것 같았다. 일단 routes와 route를 써서 해결해야 할 것 같다.
- 🛠️ 테스트 코드 작성
- 워드 클라우드
- 컴포넌트 설계
- 스토리북 적용
- useAnimation Hook
- 룰렛 컴포넌트
- 토스트 컴포넌트
- useInView Hook
- 색상 영역 컴포넌트
- msw
- webpack
- 컴포넌트 동시에 띄우기