[ React ] React-Router Component & Hooks 까지 알아보자!
React-Router
사용자의 브라우저가 클라이언트 사이드에서 뷰 렌더링을 담당하도록 돕는 라이브러리
💡 서버 사이드 렌더링을 할 때에도 라우팅을 도와주는 컴포넌트들을 제공해준다.
라이브러리 설치하기
프로젝트 디렉토리로 이동하여 다음 명령어를 통해 리액트 라우터를 설치한다.
yarn add react-router-dom
1. Components 🔥
Route
- 현재 URL 경로와 매치될 경우 보여줄 컴포넌트를 지정하는데 사용하는 컴포넌트
➰ props >path
: 매치시킬 경로,component
: 보여줄 컴포넌트
<Route path="/home" component={Home} />
Link
- HTML의
<a>
태그와 동일한 역할을 하는 컴포넌트
➰ props >to
: 이동할 경로를 지정
<Link to="/home">This is home</Link>
👉 'This is home' 텍스트는 클릭할 수 있게 렌더링 되어 클릭 시, 주소창 경로는 '.../home'으로 변경된다.
Router
Route
,Link
컴포넌트가 함께 동작할 수 있도록 연결시켜주는 컴포넌트로, 항상Router
를 공통 상위 컴포넌트로 가져야한다.
➰ props >history
<Router>
...
<Route />
<Route />
...
</Router>
Router
의 종류에는BrowserRouter
,HashRouter
,withRouter
등이 존재한다.
🔎 더 알아보기
history
리액트에서
Router
들은 props로history
객체를 주고 받으며 페이지의 기록을 공유한다.
history
객체를 콘솔로 확인해보면 다양한 메소드와 관련 객체들이 존재한다. 가장 빈번하게 사용되는 메소드는push()
인데, 이는history.push('이동하고자 하는 path')
를 통해 원하는 컴포넌트로 이동이 가능하다.
1.history
객체
2. 예제 코드
props
로 받은 history의 메소드push
를 이용해pathname
과state
가 담긴 객체를pathname
에 적힌 경로로 전달하는 코드이다.
HashRouter
- 주소창에 해쉬(#)가 붙는다.
- 검색 엔진이 읽지 못하기에 거의 사용되지 않는다.
( 백엔드가 필요하지 않은 상황에 주로 사용 )
BrowserRouter
- HTML5의
history
API를 활용한 라우터 - 주로 사용되는 라우터
Switch
- 모든
Router
컴포넌트들을 반복하며, 현재 URL과path
가 일치하는 첫번째 요소만 렌더링 하여 라우터 충돌을 막도록 하는 컴포넌트
<Router>
<Switch>
<Route exact path="/" component = { Main }/>
<Route path = "/about" component = { About }/>
</Switch>
</Router>
🔎 더 알아보기
<Router> <Route exact path="/" component = { Main }/> <Route path = "/about" component = { About }/> <Route path = "/detail" component = { Detail }/> <Route component = { Error }/> </Router>
만약, 3가지
path
(1~3줄)와 일치하지 않아 어떠한 URL로도 이동할 수 없는 경우에Error
컴포넌트를 띄우기 위해 4번째 줄과 같이Route
를 추가해보자. 실제로 실행시켜보면 어떠한 URL에도Error
컴포넌트가 렌더링 되는 것을 볼 수 있다.
👉 왜냐하면, 4번째 줄은 매칭시킬path
의 값이 없으므로무조건적으로 렌더링이 되기 때문이다.
이를 해결하기 위해Switch
가 등장하였고, 위 코드는 다음으로 해결할 수 있다.<Router> <Switch> <Route exact path="/" component = { Main }/> <Route path = "/about" component = { About }/> <Route path = "/detail" component = { Detail }/> <Route component = { Error }/> </Switch> </Router>
❔
exact
: 정확히 동일한path
가 들어왔을 경우에만 컴포넌트를 렌더링 하도록 하여 중복 컴포넌트 렌더링을 막는다.
2. Hooks 🔥
- class 작성 필요 없이 상태값(state)와 Hooks를 통해 react-router의 기능들을 이용할 수 있다.
- Hooks를 사용하기 전에 match, location, history의 역할에 대해서도 이해할 수 있도록 하자.
useLocation
🐾
location
객체는 현재 페이지의 정보를 가진다. 대표적으로location.search
로 현재url
의 쿼리 스트링을 가져올 수 있다
🚀 사용 예시
const location = useLocation();
다음은 네이버 영어 사전에 'hello'를 검색한 후 location
을 확인했을 때의 결과이다.
location
객체 내의 search
메소드를 통해 쿼리스트링 결과값을 가져올 수 있다.
useHistory
🐾
history
객체는 브라우저의 이동 기록들을 가지고 있다. 스택(stack)에 현재까지 이동한 url 경로들이 담겨있는 형태로, 주소를 임의로 변경하거나 되돌아갈 수 있도록 해준다
🚀 사용 예시
const history = useHistory();
history.push('/');
💡 function component에서도 다음을 통해 페이지 이동 시 객체를 전달할 수 있다.
history.push({
pathName: '/',
state: {
isOk: true,
root: main
}
});
-> 이동한 페이지의 location.state
를 확인하면 전송된 객체의 값들을 가져올 수 있다.
useRouteMatch
match
객체에는Route
의path
와url
이 매칭된 대한 정보가 담겨진다. 대표적으로match.params
로path
에 설정한 파라미터값을 가져올 수 있다.
🚀 사용 예시
const match = useRouteMatch();
❔ match
: Route
컴포넌트의 props인 path
가 URL에 어떻게 match 되는가에 대한 정보를 담는 객체
useParams
- 현재
Route
컴포넌트의match.params
에 접근해 사용할 수 있도록 한다.
Main
페이지에서 history.push
를 통해 first
페이지로 이동할 때, pathname
에 id
를 붙여서 푸시해보자.
Route
의 속성인 path
에는 아래 사진에서 볼 수 있듯이 :id
를 추가해주자.
first
페이지에서 params
를 확인해보면 main
페이지에서 first
로 보낸 params
즉, id
값이 url
과 페이지에 전송된 것을 확인할 수 있다.
💭
공식 api 문서와 블로그를 통해 실제로 실습해보고 공부하며 글을 정리해보았지만 실제로 많이 사용해보고 익숙해져야 할 것 같다.
Author And Source
이 문제에 관하여([ React ] React-Router Component & Hooks 까지 알아보자!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@da__hey/React-React-Router-공부하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)