상세 컨텐츠

본문 제목

[React] React Router 사용하기

React

by 래모 2022. 6. 13. 20:36

본문

// 리액트를 다루는 기술 13장

// 블로그도 참고했음 https://goddaehee.tistory.com/305

라우팅이란?

: 다른 주소에 다른 화면을 보여주는 것

쉽게 말해서 사용자가 요청한 URL에 따라 해당 URL에 맞는 페이지를 보여주는 것

 

더보기

리액트는 SPA(SingPageApplication) 방식을 취한다.
말 그대로 한 개의 페이지로 이루어진 애플리케이션이라는 뜻으로 
기존 웹 페이지는 (MPA방식) 여러 개의 페이지를 사용하여 새로운 페이지를 로드하지만

SPA 방식은 새로운 페이지를 로드하지 않고 하나의 페이지 안에서 필요한 데이터만 가져오는 형태를 가진다

(즉, 새로고침을 안 함)

 

설치 방법

//yarn
yarn add react-router-dom

//npm
npm install react-router-dom

 

사용 방법

<Route path="주소규칙" element={<보여 줄 컴포넌트/>}/>

기존 v5에서는 compoenet를 썼으나 v6로 업데이트 되면서 element로 교체되었다고 한다.

자세한 것은 공식 문서 참고!

https://reactrouter.com/docs/en/v6/upgrading/v5#upgrading-from-v5

 

React Router | Upgrading from v5

Declarative routing for React apps at any scale

reactrouter.com

 

종류

  • BrowserRotuer: HTML5를 지원하는 브라우저의 주소를 감지
  • HashRotuer : 해시 주소를 감지

// HashRotuer은 주소창에 #이 추가되어 주소가 깔끔하게 보여지진 않는다. 그래서 최대한 BrowserRotuer를 사용함

 

BrowserRotuer

BrowerRotuer는 다음과 같이 사용한다.

  • <BrowserRotuer>태그로 컴포넌트 사용하기
  • <Rotues>, <Route> 컴포넌트 사용하기
    • Rotues : 여러 Route를 감싸서 그 중 규칙이 일치하는 라우트 단 하나만을 렌더링 시켜주는 역할을 한다.
    • Rotue : path 속성에 경로, element 속성에는 컴포넌트를 넣어준다

 

예시

//APP.js
import React from 'react';
import { BrowserRouter, Routes, Route , Link} from "react-router-dom";
import About from './About';
import Home from './Home';

const App = () => {
  return(
    <div>
      <BrowserRouter>
        <Routes>
          <Route path="/" element = {<Home/>}/>
          <Route path="/about" element = {<About/>}/>
        </Routes>
      </BrowserRouter>
    </div>
    
  )
}

export default App;
//Home.js
import React from 'react';

const Home = () => {
    return (
        <div>
            <h1>홈</h1>
            <p>홈, 그 페이지는 가장 먼저 보여지는 페이지</p>
        </div>
    )
}

export default Home;
//About.js
import React from 'react';

const About = () => {
    return (
        <div>
            <h1>소개</h1>
            <p>이 프로젝트는 리액트 라우터 기초를 실습해 보는 예제 프로젝트입니다.</p>
        </div>
    )
}

export default About;

 

이렇게 코드를 짜면 제일 메인화면에는 Home.js가 뜨고

주소창에 /about을 추가하면 About.js가 보여진다

 

Link

: 클릭하면 다른 주소로 이동시켜 주는 컴포넌트

 

일반 웹 어플에서 a태그를 사용하여 페이지를 전환하는 것과 비슷하다

다른 점이 있다면 a태그는 페이지를 전환하는 과정에서 페이지를 새로 불러오기 때문에 어플이 들고 있던 상태들을 모두 날리는 반면 Link컴포넌트는 페이지를 새로 불러오지 않고 어플을 그대로 유지한 상태에서 페이지의 주소만 변경해준다

 

다음과 같이 사용함

<Link to "주소">내용</Link>

 

아까 작성한 Home에 간단하게 추가하면 아래와 같다.

import React from 'react';
import {Link} from 'react-router-dom';

const Home = () => {
    return (
        <div>
            <h1>홈</h1>
            <p>홈, 그 페이지는 가장 먼저 보여지는 페이지</p>
            <h1><Link to = "/about">소개</Link></h1>
        </div>
    )
}

export default Home;

 

링크 생겼다!

저 링크를 누르면 About.js로 넘어간다 새로고침없이!

 

URL파라미터와 쿼리

페이지 주소를 정의할 때 유동적인 값을 전달할 때도 있음 . 이는 파라미터와 쿼리로 나뉨

  • 파라미터 예시 : /profiles/velopert
  • 쿼리 예시 : /about?details=true

어디에 무엇을 써야하는 규칙은 없지만 일반적으로 파라미터는 특정 아이디 혹은 이름을 사용하여 조회할 때 사용하고,

쿼리는 우리가 어떤 키워드를 검색하거나 페이지에 필요한 옵션을 전달할 때 사용

 

URL파라미터

새로 profile.js를 만들어주겠음!

/profile/velopert와 같은 형식으로 뒷부분에 유동적인 username값을 넣어줄 때 해당 값을 props로 받아와서 조회하는 방법에 대해 알아보자

//Profile.js
import React from 'react';
import { useParams } from 'react-router-dom';

const data = {
    velopert: {
        name: '조땡땡',
        description: '초보 리액트 개발자'
    },
    gildong : {
        name: '고길동',
        description: '아기공룡 둘리에 나오는 아부지'
    }
}

const Profile = () => {
    const {username} = useParams();
    const profile = data[username];
    if(!profile) {
        return <div>존재 하지 않는 사용자입니다.</div>
    }
    return (
        <div>
            <h3>
                {username} ({profile.name})
            </h3>
            <p>{profile.description}</p>
        </div>
    )
}

export default Profile;

✳️ useParams : 파라미터의 정보를 가져오는 hook이다. 예를들어 ~url~/1이라면 useParams는 1을 가져온다.

 

//App.js
import React from 'react';
import { BrowserRouter, Routes, Route, Link } from "react-router-dom";
import About from './About';
import Home from './Home';
import Profile from './Profile';

const App = () => {
  return(
    <div>
      <BrowserRouter>
          <ul>
            <li>
              <Link to = "/">홈</Link>
            </li>
            <li>
              <Link to = "/about">소개</Link>
            </li>
            <li>
              <Link to = "/profile/velopert">velopert 프로필</Link>
            </li>
            <li>
              <Link to = "/profile/gildong">gildong 프로필</Link>
            </li>
          </ul>
          <hr/>
        <Routes>
          <Route path="/" element = {<Home/>}/>
          <Route path="/about" element = {<About/>}/>
          <Route path="/profile/:username" element = {<Profile/>}/>
        </Routes>
      </BrowserRouter>
    </div>
    
  )
}

export default App;

파라미터에 변수명을 사용할 땐 ": "이 필수로 들어간다

(아까랑 달리 Home에서 링크 없애는 방향으로 좀 수정했음)

완성!

 

useMatch

const match = useMatch(“/:coinId/price”);

console.log(match)
//여기서 현재 url 상태가 다음과 같다면 true을 반환 다르면 false를 반환한다.

 

useNavigate

useNavigate 훅을 실행하면 페이지 이동을 할 수 있게 해주는 함수를 반환함

반환하는 함수를 navigate라는 변수에 저장 후 navigate의 인자로 설정한 path값을 넘겨주면 해당 경로로 이동할 수 있음

Link와 다른 점은 함수 호출을 통해 페이지를 이동하기 때문에 특정 조건을 충족할 경우에 페이지 이동을 하도록 할 수 있음

import React from "react";
import { useNavigate } from "react-router-dom";

function Login() {
  const navigate = useNavigate();

  const goToMain = () => {
    navigate("/main");
  };

  // 실제 활용 예시
  // const goToMain = () => {
  //   if(response.message === "valid user"){
  //     navigate('/main');
  //   } else {
  //     alert("가입된 회원이 아닙니다. 회원가입을 먼저 해주세요.")
  //     navigate('/signup');
  //   }
  // }

  return (
    <div>
      <button className="loginBtn" onClick={goToMain}>
        로그인
      </button>
    </div>
  );
}

export default Login;

 

useLocation

: 현재 url 정보를 가져옴

'React' 카테고리의 다른 글

[React] redux 기초  (0) 2022.06.29
[React] styled-components  (0) 2022.06.15
[React] API 호출하기  (0) 2022.06.13
[React] 투두리스트 컴포넌트 구조 및 코드 분석  (0) 2022.06.09
[React] Hooks: useMemo, useCallback, useRef  (0) 2022.06.05

관련글 더보기