부모에서 자식 컴포넌트로 값을 전달해야 하는 상황에서는 보통 props를 통해 전달한다. 자식 컴포넌트가 아닌 페이지를 이동하면서 다른 컴포넌트에 값을 전달해야 하는 경우 부모와 자식 관계가 아니기 때문에 다른 방법을 사용해야 한다.
이때 사용하는 방법이 값을 전달해줄 페이지에서 useNavigate()
로 값을 전달해주고, 값을 받을 페이지에서 useLocation()
으로 값을 받는 방법이다.
Link
와 다른 점은 함수 호출을 통해 페이지를 이동하기 때문에 특정 조건을 충족할 경우에 페이지 이동을 하도록 할 수 있다.기본 구문
const navigate = useNavigate(); navigate('/이동할 페이지 주소', 전달할 값)
useNavigate
를 가져온다.import { useNavigate } from 'react-router-dom';
useNavigate()
함수를 변수에 할당한다.const navigate = useNavigate();
const reload = () => {
navigate(0); // 새로 고침
}
const back = () => {
navigate(-1); // 뒤로 가기
}
const forward = () => {
navigate(1); // 앞으로 가기
}
const home = () => {
navigate('/'); // 메인 페이지로 가기
}
// on Click event로 호출한 경우
<button onClick={reload}>새로고침</button>
<button onClick={back}>뒤로가기</button>
<button onClick={forward}>앞으로가기</button>
<button onClick={home}>홈 화면으로 가기</button>
state
를 사용한다면 navigate(/이동할 페이지 주소, { state: { 키: 값 } })
의 형태로도 가능하다. to
는 <Link>
에서 사용한 to=''와 동일한 내용.(가고자 하는 url을 넣으면 된다)
만약 replace
기능이 필요하다면, navigate(to, { replace: true })의 형태로 사용할 수 있다.
// 부모 컴포넌트
function ContentList() {
const [contentData, setContentData] = useState<ContentData[]>([]);
const getContentData = async () => {
try {
const res = await axios.get("http://localhost:3001/contents");
setContentData(res.data);
} catch (err) {
console.error(err);
}
};
useEffect(() => {
getContentData();
}, []);
return (
<ListContainer>
<ListArea>
<List>
{contentData.map((value) => {
return <ContentItem key={value.id} list={value} />;
})}
</List>
</ListArea>
</ListContainer>
);
}
export default ContentList;
list
를 detail 페이지에서 값을 받을 수 있도록 navigate의 두 번째 인자로 전달한다.// 자식 컴포넌트
function ContentItem({ list }: ContentDataProps) {
const navigate = useNavigate();
const moveDetailPage = () => {
navigate(`/library/content/${list.id}`, {
// navigate의 두 번째 인자로 전달한 값을 state로 지정한다.
state: {
list,
},
});
};
return (
<ItemContainer onClick={moveDetailPage}>
<ItemTitle>{list.title}</ItemTitle>
<LikeButton>❤️ {list.likes}</LikeButton>
</ItemContainer>
);
}
export default ContentItem;
useLocation
을 가져온다.import { useLocation } from "react-router-dom";
useLocation()
함수를 변수에 할당한다.const location = useLocation();
import { useLocation } from "react-router-dom";
function DetailPage() {
const location = useLocation();
const detailData = location.state.list;
console.log(detailData);
return <div>{location.state.list.title}</div>;
}
export default DetailPage;
개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.