useNavigate() & useLocation()

Now, Sophia·2022년 1월 15일
7

TIL-REACT

목록 보기
9/11
post-thumbnail

제품 상세 페이지에서 "결제하기" 를 눌렀을 때, 결제페이지로 이동하면서 데이터를 전달해야 한다.
다음주 월요일까지 프론트에서 주문정보를 보내서 서버에 저장되고 난 다음에 결제하는 외부 API 호출한 후, 결제를 하고.. 또 결제정보를 서버로 보낼 수 있도록 해야한다.
..이러한 플로우 이해하는 것도 어려웠다..😭
아직 디자인이 나오지 않았기 때문에 레이아웃이 중요하지 않았다.
서버에서 테스트 할 수 있게 대략적으로 짜면 된다고 했다.
그래서 정말 상품명, 갯수, 금액만 전달할 수 있도록 레이아웃을 짜고 전달하려는데.......

▶︎ 문제

페이지 -> 페이지 이동은 <Link to> 태그를 생각했고, 데이터 전달은 state 면 된다고 생각했다.
그리고 useLocation() 을 통해 데이터를 받으면 된다고 했다.
처음에는 buttononClick을 통해 함수가 실행되고 return 값으로 Link to 가 실행되도록 했었다. 하지만 onClick은 되는데 페이지가 넘어가지 않았다.
그래서 다시 또 구글링하면서 useHistory, useNavigate 등을 찾아냈다.

🧗🏻‍♀️ 시행착오


1. useHistory 적용

react-router-dom v6에서 사라졌기 때문에 적용할 수가 없다.
그래서 하기와 같은 에러가 나오니 주의하세요!

history.push는 더이상 없다


buttononClick 이벤트 handleClick을 통해 Link to를 적용했으나 값만 콘솔에 찍힐 뿐, 페이지로 이동이 되지 않았다..


// 처음 생각했던 코드
const Product = () => {
  const handleClick = () => {
    return <Link to={{
      		    pathname: '/',
      		    state: {
       		      title: title,
          	     },
     		 }}
  	     >
          }
        };  

💡 해결

🔺 useNavigate() & useLocation() 적용

인터넷에 찾아봐서 useNavigate()를 통해 페이지 이동하면서 state 값을 전달하고, useLocation()을 통해 데이터를 전달 받는 것이다.

// 데이터 전달 페이지
import { useNavigate } from 'react-router-dom';

const Product = () => {
  const navigate = useNavigate();

  const title = '내가 파는거';

  const handleClick = () => {

    navigate('/', {
      state: {
        title: title,
      },
    });
    return <button onClick={handleClick}>버튼</button>
  };

// 데이터 받는 페이지
import { useLocation } from 'react-router-dom';

const Order = () => {
  const location = useLocation();
  console.log('state', location.state);
  const { title } = location.state;

성공


🙏 집단지성

위코드. 짱

사실 시행착오를 2개만 적어서 그렇지 이틀을 고생했다..
useParams, useHistory, useNavigate, useLocation, Link to..
심지어 useNavigate & useLocation를 썼을 때도 오류가 떠서 진짜 방법이 없는 줄 알았다.

-> 이 경우엔 useLocation이 메서드인데 뒤에 소괄호를 안했었고, 잘못된 구조분해할당이었다.

포기하기 직전에 스택오브플로우에 글을 남겼고, 정말 너무너무 멋진 분들이 주말에도 댓글을 달아주셨다.
하기와 같이 참고할 수 있는 글까지도 첨부해주셨다.
열심히 적용했지만 오류는 계속 되었다.
그러다가 글을 남긴 덕분에 동기 김용현님께서 직접 코드까지 치는 열정적인 모습을 보여주셨고, 내가 어느부분이 틀렸는지 알 수가 있었다.

주말에도 너무너무 감사했다..😭
아니 어쩜 그렇게 똑똑한지.......황금동아줄이다.

회사를 다니면서 정말 동기분들에게 많은 도움을 받고 있다.
내가 모르는 부분이 있다면 주변 어디든지 물어보자!

집단지성, 그 힘은 어마어마 하다.

다시 한 번 그들의 지성과 지식공유에 감사 드리며 다들 꿀주말 보내세요!

참고글

profile
Whatever you want

1개의 댓글

comment-user-thumbnail
2023년 2월 1일

잘 읽고 갑니다. 감사합니다.

답글 달기