React

#17 Router

Sila 2022. 5. 8. 01:03

 

리액트 앱에서 컴포넌트의 모든 요소를 전부 동시에 보여줄 필요는 없다.

 

사용자가 한 번에 그 기능을 다 사용하지도 않을 뿐더러 리소스 사용 측면에 있어서도 이는 비효율적이다.

 

그래서 router기능을 이용해 각 기능들을 다른 주소에 분리하고, 원할때만 이를 가져와 보여줄 수 있다.

 

정확히 말하자면 다른 주소에 있는 다른 화면을 보여주는 것이 router이다.

 

이를 이용해 메뉴를 클릭하면 다른 탭을 보여준다거나 하는 기능을 추가할 수 있다.

 

이는 react 내장 기능은 아니므로 npm을 이용해 라이브러리를 설치해야한다.

 

npm i react-router-dom

 

/*  src/app.js  */

import { BrowserRouter as Router, Link, Routes, Route } from 'react-router-dom'

function App() {
    return (
        <>
            hello router
        </>
    )
}

export default App

 

hello router가 잘 출력이 되었다면 이제 App 컴포넌트를 다음과 같이 바꿔보자.

 

/*  src/App.js  */

function App() {
   return (
      <>
         <Router>
            <header>
               <nav>
                  <Link to='/'> Home </Link>
                  <Link to='/counter'> Counter </Link>
                  <Link to='/comment'> Comment </Link>
                  <Link to='/login'> Login </Link>
               </nav>
            </header>
              
            <Routes>
               <Route path='/' element = {<Index/>}/>
               <Route path='/counter' element = {<Counter/>}/>
               <Route path='/comment' element = {<Comment/>}/>
               <Route path='/login' element = {<Login/>}/>
            </Routes>
         </Router>
      </>
   )
}

 

앞서 react-router-dom에서 BrowserRouter (이하 Router), link, routes, Route를 가져왔는데,

 

각각을 전부 사용해본 것이다.

 

우선 Router는 라우터 기능을 사용할 것들을 하나로 묶어주는 역할을 한다.

 

Link는 html의 anchor element와 동일한 기능으로, 클릭하면 그 주소에 대응하는 <Route/>의 element를 

 

불러올 것이다.

 

Route element에 path 값은 연결하고 싶은 Link의 to와 동일한 값을 주면 된다.

 

element에는 불러오고 싶은 컴포넌트를 값으로 준다.

 

이런 Route들을 묶어주는 기능을 하는게 <Routes/>이다.

 

위의 컴포넌트를 예시로 들면,

 

<nav> element안의 Counter를 클릭하면 Link의 to의 value인 '/counter'를

 

path attribute의 value로 가지는 Route element를 확인한다.

 

그리고 그 Route element가 가진 element attribute의 value에 해당하는 <Counter/> 컴포넌트를 가져온다.

 

이제 각 Route에 있는 컴포넌트를 대충 만들어서 import 하자.

 

src 폴더에 pages 폴더를 만들고 그 안에 다시 comment, counter, index, login 폴더를 만든다.

 

각 폴더 안에는 index.jsx 파일을 만들고 다음과 같이 컴포넌트를 만들어 export 한다.

 

/*  src/pages/comment/index.jsx  */

const Comment = () => {
    return(
        <>
            Comment Page
        </>
    )
}

export default Comment

 

/*  src/pages/counter/index.jsx  */

const Counter = () => {
    return(
        <>
            Counter Page
        </>
    )
}

export default Counter

 

/*  src/pages/index/index.jsx  */

const Index = () => {
    return(
        <>
            Index Page
        </>
    )
}

export default Index

 

/*  src/pages/login/index.jsx  */

const Login = () => {
    return(
        <>
            Login Page
        </>
    )
}

export default Login

 

이것들을 각각 App.js에서 import 한다.

 

import { BrowserRouter as Router, Link, Routes, Route } from 'react-router-dom' 

import Index from './pages/index/index.jsx'
import Comment from './pages/comment/index.jsx'
import Counter from './pages/counter/index.jsx'
import Login from './pages/login/index.jsx'

(...생략)

 

'React' 카테고리의 다른 글

error record : styled-compoenents  (0) 2023.03.19
#16 Redux part2  (0) 2022.05.07
#15 Redux part1  (0) 2022.05.07
#14 useMemo, useCallback  (0) 2022.05.02
#13 useReducer  (0) 2022.05.01