Closed YoonJieut closed 7 months ago
모두 갈아 엎어버렸다. 처음부터 다시 해보자.
// todo1 : 현재의 url을 참고하여 현재 메뉴를 표시한다. // 1. 현재 url에서 "/"을 기준으로 맨 뒤의 문자열을 가져온다. // 2. 가져온 문자열을 컴포넌트에 업데이트 한다. // todo2 : 이전, 다음 버튼을 클릭하면 이전, 다음 메뉴로 이동한다. // 1. 가져온 문자열을 기준으로 현재 메뉴의 index를 반환해본다. // 2. portfolioMetaData에 맞춰서 이전, 다음 메뉴로 리디렉션한다. // 3. 맨 뒤로 가면 처음으로 돌아오는 로직을 추가한다. (0에서 뒤로 가면 마지막으로 간다 그리고 마지막에서 앞으로 가면 처음으로 간다.)
todo, 슈도 코드 셋업
Feat : 삼항 조건문을 통한 루프 기능 구현
그러나 버튼을 누르면 리렌더링 될 필요는 없지 않을까? 너무 과한 기능인 것 같다. 나는 랜더링 될 때만 상태가 바뀌면 될 것 같다.
const MenuComp = () => {
const [url, setUrl] = useState("");
const [currentMenu, setCurrentMenu] = useState("");
const [currentIndex, setCurrentIndex] = useState(0);
// 현재 url을 가져온다.
useEffect(() => {
console.log("MenuComp useEffect");
setUrl(window.location.href);
}, []);
useEffect(() => {
console.log("MenuComp useEffect2");
const param = urlParamMaker(url);
setCurrentMenu(param as string); // 타입에러 : 타입을 string으로 강제로 변환했다.
// 현재 param을 기준으로 현재 메뉴의 index를 반환한다.
const nowIndex = portfolioMetaData.findIndex(
(data) => data.name.toLowerCase() === param
);
// 찾은 url이 없을 때, 오류 처리
if (nowIndex === -1) {
setCurrentIndex(0);
return;
}
console.log(nowIndex);
setCurrentIndex(nowIndex);
}, [url]);
const handlePrevClick = () => {
setCurrentIndex((prevIndex) =>
prevIndex === 0 ? portfolioMetaData.length - 1 : prevIndex - 1
);
};
const handleNextClick = () => {
setCurrentIndex((prevIndex) =>
prevIndex === portfolioMetaData.length - 1 ? 0 : prevIndex + 1
);
// window.location.href = portfolioMetaData[currentIndex].path;
};
return (
<>
<div className="w-full flex justify-between mt-20">
<button onClick={handlePrevClick}>이전 페이지</button>
<button onClick={handleNextClick}>다음 페이지</button>
</div>
<H1 text={currentMenu} />
<div>현재 인덱스는? {currentIndex}</div>
<div>length-1? {portfolioMetaData.length - 1}</div>
<div>{portfolioMetaData[currentIndex].path}</div>
</>
);
};
export default MenuComp;
완료된 작업
아 이렇게 하는 것이었다. 내가 만든 코드를 공식 홈페이지를 통한 것으로 다시 바꿔보고, 원리 파악해보고, custom훅으로 다시 정리까지 깔끔하게 가독성을 높인다.
const MenuComp = () => {
const { currentMenu, prevIndex, nextIndex } = useMenuNavigation();
return (
<>
<div className="w-full flex justify-between mt-20">
<Link href={portfolioMetaData[prevIndex].path}>이전 페이지</Link>
<Link href={portfolioMetaData[nextIndex].path}>다음 페이지</Link>
</div>
<H1 text={currentMenu} />
</>
);
};
export default MenuComp;
pf 상세 페이지 메뉴 구현 완료
생각보다 쉽게 해결되지 않는다.
메뉴 기능 구현 중 useRouter를 사용할 수 없는 문제가 발생
시도1 - window.location.href를 활용해서 하기 위해선 client -side가 필요한 모양 시도2 - 병렬 로딩 작성법 실수 : 자식 디렉토리 중 "@디렉토리이름"으로 작동하지 않는 문제가 발생했었다. 파라미터와 호출 방식을 default.tsx를 사용하지 않는 방식을 사용(호출시 컴포넌트로 불러옴) -> default가 필요한 것은 어떤 것이었는지 아직 감이 안잡힌다.
나중에 할 일