ㅇㅇㅈ Blog

프론트엔드 수행중

0%

React-router-dom v6

React-router-dom v6

강의에서는 5버전으로 강의해서 그냥 따라하다가 안돼서 v6으로 버전업해서 진행..

Routes

5버전에 있던 Switch가 Routes로 변경되었다
그리고 Route를 Routes로 감싸주지 않으면 에러가 발생한다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import { Routes, Route } from 'react-router-dom'
import './App.css'

import Home from './pages/Home'
import Profile from './pages/Profile'
import About from './pages/About'
import NotFound from './pages/NotFound'
import Links from './components/Links'
import NavLinks from './components/NavLinks'
import Login from './pages/Login'

function App() {
return (
<>
<Links></Links>
<NavLinks></NavLinks>
<Routes>
<Route path='/login' element={<Login></Login>}></Route>
<Route path='/profile/:id' element={<Profile />}></Route>
<Route path='/profile' element={<Profile />}></Route>
<Route path='/about' element={<About />}></Route>
<Route path='/' element={<Home />}></Route>
{/* Not Found */}
<Route path='/*' element={<NotFound />}></Route>
</Routes>
</>
)
}
export default App
  • Route 에서 변경점
    • 5에서는 component = { Home } 방식으로 연결했다면
    • 6에서는 element = {<Home />} 처럼 컴포넌트를 연결 해줘야 한다
  • exact를 통해 복수 라우팅을 방지했는데 exact가 삭제됨
    • 여러 라우팅을 매칭하기 위해 ‘*’ 을 붙인다
1
<Route path='/*' element={<NotFound />}></Route>

URL 파라미터와 쿼리

  • 파라미터 : ‘profile/1’
  • 쿼리 : ‘about?name=mark’

URL 파라미터 useParams

6버전에서는
useParams로 파라미터를 조회한다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { useParams } from 'react-router-dom'
function Profile() {
const parmas = useParams()
console.log(params)
return (
<div>
<h2>Profile 페이지 입니다.</h2>

{parmas.id && <p>id 는 {parmas.id} 입니다</p>}
</div>
)
}
export default Profile

console로 찍어보면 객체데이터로 출력된다

URL 쿼리

useLocation을 사용해 조회한다

URL 쿼리는 “?name=mark”과 같이 문자열로 되어 있고, 특정 값을 읽어 오기 위해서는 문자열을 객체 형태로 반환해야한다. 그 과정에서 qs 라는 라이브러리를 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
import queryString from 'query-string'
import { useLocation } from 'react-router-dom'

export default function About() {
const search = useLocation()
console.log(search)
return (
<div>
<h2>About</h2>
</div>
)
}

search를 콘솔로 찍어보면 여러 속성이 들어있다



현재 프로젝트에서는 search 부분만 필요하므로 search만 구조분해로 받아온다

1
2
3
4
5
6
7
8
9
10
11
12
import queryString from 'query-string'
import { useLocation } from 'react-router-dom'

export default function About() {
const { search } = useLocation()
console.log(search)
return (
<div>
<h2>About</h2>
</div>
)
}

문자열로 찍힌다
qs로 격체 형태로 변환해서 사용 하면 된다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import queryString from 'query-string'
import { useLocation } from 'react-router-dom'

export default function About() {
const { search } = useLocation()
console.log(search)
const query = queryString.parse(search)
return (
<div>
<h2>About</h2>
{query.name && <p>name은 {query.name}입니다.</p>}
</div>
)
}

useNavigate

useNavigate를 통해 사용자를 특정 Url로 리디렉션 한다

1
2
3
4
5
6
7
8
9
10
import { useNavigate } from 'react-router-dom'
export default function LoginButton() {
const navigate = useNavigate()
function login() {
setTimeout(() => {
navigate('/')
}, 1000)
}
return <button onClick={login}>로그인하기</button>
}