React.js Routing
02 Feb 2021 | ReactReact.js Routing
-
Routing이란
- 기존 웹 사이트의 구조는 여러 페이지로 구성되어, 클라이언트가 요청할 때마다 페이지가 새로고침되어 로딩되며 서버로부터 리소스를 전달받아 해석 후 렌더링을 했다
- 이런 불필요한 트래픽 낭비를 줄이고자 Single Page Application 통칭 SPA가 나오게 되었는데, SPA는 주소에 따라서 다른 뷰를 보여주는 라우팅을 이용한다
- 클라이언트의 브라우저에서 뷰 렌더링이 이루어지기 때문에 서버의 부하를 줄이고 당연히 속도도 상승한다
- React에는 공식적으로 라우팅을 지원하는 라이브러리가 없으며 react-router는 써드 파티 라이브러리로 쉽게 라우팅을 구현할 수 있다
- react-router-dom 패키지는 웹 개발에 쓰이는 컴포넌트를 지원하며 react-router-native는 앱 개발 컴포넌트를 지원한다. react-router는 이 둘을 합친 것이다
-
Routing
- npm install –save react-router-dom
- BrowserRouter는 HTML5의 History API를 이용하여 새로고침 없이 주소변경이 가능하도록 해준다
- Route에는 exact라는 옵션이 있다. exact는 path와 정확히 경로가 일치해야 render가 된다. Route는 동일한 path로 여러 개 설치가 가능하기 때문에 이 옵션을 이용해서 항상 보여줄 menu bar 등을 깔아둘 수 있다
- Route의 렌더링 방식은 두 가지. 일반적으로 component를 많이 쓴다. render는 hard-coding이 필요한 경우
// Root Component import { BrowserRouter } from 'react-router-dom'; const Root = () => ( // Root Component를 BrowserRouter 적용 <BrowserRouter> <App /> </BrowserRouter> );
import { Route } from 'react-router-dom'; <Route path='/' exact component{Posts} /> <Route path='/about' render={() => <h1>안녕</h1>};
-
Link
- re-load는 현재 state 값을 잃어버리는등 자원 소실의 우려가 있고 처음부터 다시 rendering이 진행된다
- re-render만으로 페이지 이동이 가능해야한다
- Router의 Link 태그는 이 부분을 해결해준다, a 태그를 Link 태그로 바꾸자
<Link to='/'>Home</Link> <Link to>about</Link>
-
withRouter
- 일반 컴포넌트에서 라우터에서 사용하는 객체(history, match, location 등)에 접근하려면 withRouter라는 HOC(고차원 컴포넌트)를 사용해야한다.
- 이를 통해 컴포넌트에서 라우터를 제어할 수 있게 된다
- 뒤로가기 구현, Link 없이 화면 렌더링을 하는 등 다양하게 이용할 수 있다
import { withRouter } from 'react-router-dom'; /* ... */ export default withRouter(componentName);
-
Absolute Path vs Relative Path
- Link 태그의 to=’xxx/xxx’ 는 기본적으로 절대경로이다
- 절대경로는 항상 도메인 바로 뒤에 붙는다
- 절대경로는 to=’posts’ 뒤에 추가하기 위해 to=’new’를 사용해도 com/posts/new가 아닌 com/new로 이어진다
- 기존 경로에 무언가를 추가할 때 상대경로를 사용할 수 있다
- 이때 props.match를 사용할 수 있다
- /posts가 링크된 컴포넌트에서 to={props.match.url + ‘/new’}를 사용하면 com/posts/new에 무언가를 추가할 수 있다
-
NavLink
- Link와 기능은 유사하지만 NavLink가 활성화되면 active 클래스가 생성되고 이를 통해 스타일을 지정할 수 있다
- NavLinkt의 property로 activeClassName=’xxx’을 주게 되면 클래스 이름도 사용자 정의가 가능하다
- activeStyle= 등 css를 이용하지 않고 inline으로도 style 정의가 가능하다
- exact 옵션 추가 가능
-
Switch
- react-router-dom 패키지의 Switch 컴포넌트를 사용하면 여러 Route 컴포넌트들이 중첩되어 렌더링되는 것을 막을 수 있다
- Switch는 매칭되는 첫 번째 Route만 보여주고 더 이상 분석하지 않는다
- 이를 사용하기 위해서는 Route들의 상위 컴포넌트로 Switch 컴포넌트를 감싸기만 하면 된다