- 세컨핸드 프로젝트를 수정하면서 겪은 고민과 문제 해결에 대해서 기록해보고자 한다.
- 먼저 아래 두 개의 영상을 보면 사용자 입장에서 불편함을 느낄 수 있다고 생각한다.
- 프로젝트의 로직은 아래와 같다.
1. 홈화면 또는 판매내역에서 상품을 선택했을 때, 해당 상품의 상세페이지로 이동을 한다.
2. 만약 내가 등록한 상품이라면 상품 게시글을 수정할 수 있고, 수정 완료가 되면 해당 상품의 상세페이지로 이동한다.
- 이때, 위의 두 개의 영상에서 확인할 수 있듯이 상품의 수정 완료를 하고 해당 상품의 상세 페이지로 이동했을 때, 뒤로가기 버튼을 클릭하면 상품의 상세페이지의 진입점(홈화면 또는 판매내역)이 아닌 다시 상품 수정 페이지로 이동을 한다.
- 사용자입장에서는 상품의 수정을 완료한 상황에서 뒤로가기 버튼을 눌렀을 때는 처음 상품의 상세페이지의 진입점(홈화면 또는 판매내역)으로 이동을 원할 것이다.
- 따라서, 상품 상세페이지에서 상품을 수정하고 다시 상품 상세페이지로 이동했을 때, 뒤로가기 버튼의 경로를 설정해주어야 한다.
시도한 방법
- 상품의 상세페이지로 navigate를 할 때, 진입점에 대한 정보를 가지고 이동하는 방법에 대해서 고민했다.
- 기존의 로직은 상품 상세페이지의 뒤로가기 버튼을 클릭했을 때는 아래와 같이 path prop을 "back"으로 전달하고 있었고, NavbarBtn 컴포넌트에서는 path가 "back"일 경우 뒤로가기 버튼을 클릭하면 navigate(-1)로 이동하고 있었다.
// DetailPage.tsx에서 NavbarBtn을 사용하는 부분
<NavbarBtn
path="back"
// ...
/>
//...
// NavbarBtn.tsx
export const NavbarBtn = ({
path,
// ...
}: NavigateBtnProps) => {
const navigate = useNavigate();
const handleOnClick = () => {
path && (path === 'back' ? navigate(-1) : navigate(path));
};
return (
<Button
onClick={handleOnClick}
/>
);
};
- 그렇다면 path를 정의해주면 되겠다라고 생각했지만, 상품 상세페이지의 진입점은 홈화면 또는 판매내역으로 두 가지가 있기 때문에 진입점에 대한 경로를 상품페이지 - 상품 수정 페이지 - 수정 완료 후 상품페이지로 전달이 필요했다.
- 나는 구글링을 통해 방법을 찾기 시작했고, navigate의 state로 이동하는 페이지에 값을 전달할 수 있는 방법을 찾았다.
- 먼저 최종 작성된 코드는 아래와 같다.
// 상품 상세페이지의 진입점(홈화면 또는 판매내역)에서 상품 상세페이지로 이동할 때,
// navigate의 state로 현재 경로를 전달해주는 방법
// useLocation을 사용해서 현재 경로(pathname)을 확인한다
// navigate를 할 때 state로 pathname을 전달해준다
import { useLocation, useNavigate } from 'react-router-dom';
const { pathname } = useLocation();
const navigate = useNavigate();
<ListItem
// ...
onClick={() => {
navigate(`/item/${item.itemIdx}`, { state: pathname });
}}
/>
// DetailPage.tsx에서 진입점에서 navigate로 전달된 state를 확인하는 방법
import { useLocation } from 'react-router-dom';
const prevPathname = useLocation().state;
// DetailPage.tsx에서 NavbarBtn(뒤로가기 버튼)을 사용하는 부분
// path prop으로 "back"이 아닌 이전 경로를 전달
<NavbarBtn
path={prevPath}
// ...
/>
// ...
// DetailPage.tsx에서 Menu 컴포넌트 사용 부분
// 게시글 수정 버튼을 눌렀을 때, 상품 수정 페이지에도 진입점에 대한 경로를 전달
<Menu
menuButtonPropsList={[
{
shape: 'large',
state: 'default',
color: 'systemDefault',
name: '게시글 수정',
onClick: () =>
navigate(`/edit/${itemIdxStr}`, { state: prevPathname }),
},
{
shape: 'large',
state: 'default',
color: 'systemWarning',
name: '삭제',
onClick: () => setDeleteDialogOpen(true),
},
]}
/>
// 상품 수정 페이지에서 완료버튼을 누르고 상품 상세페이지로 이동할 때,
// 상품 상세페이지에서 받은 이전 경로를 navgiate의 state로 전달해주어야 한다.
import { useNavigate, useLocation } from 'react-router-dom';
const prevPathName = useLocation().state;
const handleConfirmDialogBtnClick = () => {
navigate(`/item/${uploadState.data?.itemIdx}`, { state: prevPathName })
// ...
};
* 최종 완성 화면
아쉬운 점
- 뒤로가기 버튼을 눌렀을 때의 이동하는 경로에 대한 문제는 해결해서 좋았지만, 브라우저의 뒤로가기 버튼을 눌렀을 때는 아직 동일한 현상이 발생하고 있기 때문에, 추가 학습을 통해 수정이 필요한 상태이다 🫠
'프로젝트 > 세컨핸드' 카테고리의 다른 글
[기능 구현] 동적 portal 만들기 (0) | 2024.01.22 |
---|---|
[기능 구현] 커스텀 훅(Custom Hook)을 사용하여 비동기 로딩 및 에러 상태 처리 (0) | 2024.01.22 |
[기능 구현] OAuth를 통한 로그인 기능 구현 (0) | 2024.01.22 |
[Trouble Shooting] 상품 수정시 이미지 파일 처리 (0) | 2023.09.21 |
[Trouble Shooting] 지역 설정 기능 구현 과정에서 겪은 문제 (0) | 2023.09.21 |