함께 성장하는 프로독학러
2. 라우트 이동 본문
안녕하세요, 프로독학러 입니다.
이번 포스팅에서는 SPA 어플리케이션 안에서 다른 라우트로 이동하는 방법에 대해서 알아보도록 하겠습니다.
* 포스팅의 내용은 Velopert 님의 리액트 라우터 강의를 복습한 내용이므로 Velopert 님의 원본 강의를 듣고싶으신 분들은 아래의 링크를 참조해 주세요.
<Velopert 님의 리액트 라우터 강좌> https://velopert.com/3411
Link 컴포넌트
SPA 안에서 라우트간의 이동은 HTML 의 <a> 태그를 이용하지 않습니다.
<a> 태그는 페이지 전체를 다시 로딩, 즉 새로고침 해버립니다.
따라서 새로고침하지 않고 라우트로 이동하고자 할 때는 리액트 라우터의 Link 컴포넌트를 이용합니다.
Link 컴포넌트를 사용하면 페이지 전체를 새로고침 하지 않고, 이동을 원하는 라우트로 화면을 전환해 줍니다.
Link 컴포넌트를 사용하여 Header 컴포넌트를 만들어 봅시다.
(src/components/Header.js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import React from 'react'; import { Link } from 'react-router-dom'; import './Header.css'; const Header = () => { return ( <div className="header"> <Link exact to="/" className="item">홈</Link> <Link to="/about/pro-self-studier" className="item">소개</Link> </div> ); }; export default Header; | cs |
코드의 두 번째 줄에서 리액트 라우터의 Link 컴포넌트를 불러왔습니다.
8-9번째 줄에서 Link 컴포넌트를 이용하여 '/' path 와 '/about/pro-self-studier' path 로 이동시키는 링크를 만들었습니다.
위에서 만든 Header 컴포넌트를 더 예쁘게 만들기 위해 스타일을 추가해 보겠습니다.
(src/components/Header.css)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | .header { background: #5c7cfa; display: flex; width: 100%; } .item { flex-grow: 1; text-align: center; padding-top: 1rem; padding-bottom: 1rem; color: white; text-decoration: none; font-size: 1.1rem; } .item:hover { background: #748ffc; } | cs |
flex 를 이용하여 헤더의 디자인은 꾸몄습니다.
* CSS 의 레이아웃 디자인 도구인 flex 에 익숙하지 않으신 분들은 아래의 링크를 참조해 주세요
<ㅇㅇ>
* JSX 에서 HTML 태그나 컴포넌트에 class 를 정의할 때는 class 가 아닌 className 속성을 이용한다.
그럼 이제까지 만든 Header 컴포넌트를 App 컴포넌트에 추가해 주도록 합시다.
(src/shared/App.js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import React, { Component } from 'react'; import { Route, Switch } from 'react-router-dom'; import { Home, About } from 'pages'; import Header from 'components/Header'; class App extends Component { render() { return ( <div> <Header/> <Route exact path="/" component={Home}/> <Switch> <Route path="/about/:name" component={About}/> <Route path="/about" component={About}/> </Switch> </div> ); } } export default App; | cs |
코드의 4번째 줄에서 Header 컴포넌트를 불러와 10번째 줄에서 사용했습니다.
브라우저 안에서 Header 컴포넌트가 제대로 동작하는지 살펴보도록 하겠습니다.
프로젝트 경로에서 npm start 를 통하여 어플리케이션을 실행합니다.
헤더에서 소개버튼과 홈 버튼을 눌렀을 떄 페이지가 새로고침되지 않고 바로 헤당 페이지로 이동되는것을 알 수 있습니다.
* Link 컴포넌트에 전달되는 props 들은 컴포넌트 내부의 DOM 에도 전달되므로, 일반 DOM 엘리먼트에 설정하는 것 처럼 className, style 혹은 onClick 등의 이벤트를 전달해 줄 수 있습니다.
NavLink 컴포넌트
NavLink 컴포넌트는 Link 컴포넌트와 비슷합니다.
특징이 있다면, NavLink 컴포넌트는 설정한 URL 경로가 활성화 되면, 해당 컴포넌트에 특정 스타일 또는 클래스를 지정할 수 있습니다.
(src/components/Header.js)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import React from 'react'; import { NavLink } from 'react-router-dom'; import './Header.css'; const Header = () => { return ( <div className="header"> <NavLink exact to="/" className="item" activeClassName="active">홈</NavLink> <NavLink to="/about/pro-self-studier" className="item" activeClassName="active">소개</NavLink> </div> ); }; export default Header; | cs |
위에서 Link 컴포넌트를 사용했던 부분을 NavLink 컴포넌트로 변경해 주었습니다.
URL 경로가 활성화 됐을 때, 특정 클래스를 지정하려면 NavLink 컴포넌트에 activeClassName 을 지정해 주면 됩니다.
8-9번째 줄에서 activeClassName 을 active로 지정했기 때문에 CSS 에서 active 클래스에 스타일을 지정해 줍시다.
(src/components/Header.css)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | .header { background: #5c7cfa; display: flex; width: 100%; } .item { flex-grow: 1; text-align: center; padding-top: 1rem; padding-bottom: 1rem; color: white; text-decoration: none; font-size: 1.1rem; } .item:hover { background: #748ffc; } .item:active, .item.active { background: white; color: #5c7cfa; } | cs |
21-24 번째 줄에서 active 스타일을 지정해 주었습니다.
브라우저에서 확인하면 위와 같이 활성화된 URL 의 NavLink 컴포넌트에 active 스타일이 적용된 것을 알 수 있습니다.
여기까지...
SPA 어플리케이션 안에서 라우트 이동을 하는 Link 컴포넌트와 NavLink 컴포넌트에 대해서 알아보았습니다.
<a> 태그를 사용하지 않고 이동한다는 것을 기억해 주시고, NavLink 컴포넌트에는 URL 에 따라 스타일을 다르게 지정할 수 있다는점도 숙지하시길 바라겠습니다.
그럼 다음 포스팅에서는 라우트 내부에 라우트를 설정하는 방법에 대해서 알아보도록 하겠습니다.
감사합니다.
**참고 자료 (항상 감사드립니다)
*이 포스팅이 도움이 되셨다면 다녀가셨다는 표시로 공감 부탁드릴게요! (로그인 하지 않으셔도 공감은 가능합니다 ㅎㅎ)
'Programming > react router_v4' 카테고리의 다른 글
3. 라우트 내부의 라우트 (1) | 2018.05.21 |
---|---|
1. Route 와 파라미터, 쿼리 (0) | 2018.05.18 |
0. 리액트 라우터 소개, 설치 및 설정 (0) | 2018.05.17 |