티스토리 뷰

개발/개발일지

[211023] React #05 : router

Blindr_grey 2021. 10. 24. 00:48

생활코딩! React 리액트 프로그래밍 도서를 바탕으로 React 공부시작.

금일 진도는 248P ~ 277P.

목차로는 03. React Router DOM (챕터 03, 끝)

 

1. 설치와 기본 정의

vue-router와 같은 react-router-dom 의 사용법 설명 파트.

npm install react-router-dom

 

vue에서 URL의 변경에 따른 페이지의 변화를 위해 가장 외곽을 <router-view> 태그로 감싸듯이 react-router-dom도 <BrowserRouter> 혹은 <HashRouter>로 감싸줘야 함. 둘의 차이는 이름을 보면 알겠지만 HashRouter가 Hash 태그(#) 붙는 형태의 URL이고 BrowserRouter는 해쉬없이 기존의 브라우져가 인식하던 그 형태임. 

 

그래서 예제에선 아래와 같이 ReactDOM.render에서 감쌈

import React from 'react';
import ReactDOM from 'react-dom';
import {BrowserRouter, Route} from 'react-router-dom';

ReactDOM.render(
    <BrowserRouter><App/></BrowserRouter>),
    document.getElementById('root')
)

 

2. Route & Switch 컴포넌트

Route 태그는 path라는 props를 가지며, 해당 path가 인식됐을 타이밍에 렌더링되는 주체를 정의한다.

<Route exact path="/"><Home/><Route>
<Route path="/act"><Act/><Route>
<Route path="/sample"><Sample/><Route>

 

위와 같을 경우 /sample 경로 입력시 Sample 컴포넌트가 해당 영역에 렌더링된다.

 

이때, exact라는 props가 "/" path로 정의된 Route 컴포넌트에 정의되었는데,

만약 http://localhost:3000/sample 이라는 경로로 접속시 react-router-dom은 "/" 경로와 "sample" 2개 경로를 인식하기 때문에 이 경우 <Home/>과 <Sample/> 컴포넌트가 동시에 렌더링된다. exact는 이러한 상황을 방지해주는 props이며 URL과 완전히 일치하는 path만을 렌더링하게 해준다.

 

만약 exact를 사용하지않으려면, 아래와 같이 Switch 컴포넌트로 Route 컴포넌트를 감싸주면된다.

<Switch>
    <Route path="/act"><Act/><Route>
    <Route path="/sample"><Sample/><Route>
    <Route path="/"><Home/><Route>
</Switch>

단, 여기서 순서를 역전시켜서 루트경로의 <Home/>이 맨 아래로 온 이유는, Switch 컴포넌트는 URL과 일치하는 첫 번째 컴포넌트가 발견되면 나머지 컴포넌트는 버리기 때문이다. 즉,  http://localhost:3000/sample 경로로 접근시 설명했던 것처럼 "/" 경로와 "/sample" 경로를 동시에 인식하는데, 이 중 위에 배치된 "/" 경로가 선인식되어 <Home/> 컴포넌트가 렌더링 될 것이기 때문에 맨 아래로 배치함으로써 이러한 이슈를 해결하 것이다.

 

하지만...책의 설명에 의하면 사실 아래와 같이 쓰는게 적절한 거 같다. 

<Switch>
    <Route exact path="/"><Home/><Route>
    <Route path="/act"><Act/><Route>
    <Route path="/sample"><Sample/><Route>
    <Route path="/">Not Found<Route>
</Switch>

"/" 경로에 대해 최상단에 exact를 둠으로써 http://localhost:3000/sample 경로로 접근하더라도 "/sample"과 완전히 일치하는 Route 컴포넌특 렌더링됨과 동시에, 정의해두지 않은 URL에 대해서는 최하단 Route 컴포넌트를 활용해서 Not Found라는 글자를 보여주게 된다(필요하다면 Not Found에 대한 컴포넌트를 별도 정의해서 활용해도 된다)

 

3. Link & NavLink

vue-router에서 router.push 메서드를 활용해서 URL의 변경 및 화면을 이동시키곤했는데,

react도 Link 컴포넌트를 활용하면 그런 기능이 가능하다.

<Link to="/sample">Sample</Link>

Link 컴포넌트는 to props를 통해 이동할 path를 지정하며, 위 Link 컴포넌트 클릭시

<Route path="/sample"><Sample/><Route>

이 Route 컴포넌트가 화면에 렌더링되는 것이다.

 

그리고 NavLink 라는 컴포넌트가 있는데...사실 Link랑 거의 흡사한데

현재 선택된 URL에 의해 렌더링 된 HTML에 아래와 같이 active 라는 css class가 자동 추가 된다.

4. 파라미터 전달은 vue랑 유사함

vue-router에서 path에 파라미터를 전달할 경우, 콜론을 붙였었다.

react에서도 아래와 같다.

<Route path="/sample/:sample_id">
    <Sample/>
</Route>

이와같이 콜론을 붙이고 파라미터명을 전달하면,

실제 내부의 Sample 이라는 컴포넌트에서는 useParam 이라는 훅(Hook)을 사용해서 받는다.

function Sample(){
    let params = useParams();
    console.log(params); // {sample_id: 값}
  
    return (
        <div>
            <h4>{params.sample_id}</h4>
        </div>
    )
}

위와같이 콜론을 붙여서 넘긴 파라미터명을 그대로 활용가능하다.

그리고 이 값에 따라서 추가 로직이 필요하다면 구현하면 된다.

'개발 > 개발일지' 카테고리의 다른 글

[211024] React #07 : redux  (0) 2021.10.24
[211024] React #06 : ajax(fetch)  (0) 2021.10.24
[211022] React #04 : function & class  (0) 2021.10.23
[211020] React #03 : (props vs state) + CRUD  (0) 2021.10.20
[211019] React #02 : state&event  (0) 2021.10.19
댓글
최근에 올라온 글
Total
Today
Yesterday