
node js에서 사용하던 router와는 너무 다른 React router. 이 개념을 정리해야 프로젝트에서 페이지를 만들고 컴포넌트를 가져다 쓸 수 있을 것 같아서 문서도 읽고 검색도 해가며 열심히 정리하려고 한다. (document는 읽기 어렵게 되어있고 여러 블로그 전전해가면서 공부하고 정리해보았습니다)
client side routing을 가능하게 한다. 전통적인 웹사이트들은 브라우저가 웹서버에 document를 요청하고 CSS와 javascript를 download및 evaluate하고 서버로부터 받아온 HTML을 렌더링한다. 유저가 링크를 눌렀을 때 새 페이지에 대한 프로세스가 다시 시작된다.Client side routing은 링크를 누를때마다 새 요청을 하지 않고 앱을 업데이트 하다. 즉, 새로운 UI를 렌더링하고 fetch를 통해 데이터 요청을 만들고 새로운 정보로 업데이트한다.CSR이 있다면 SSR(Server side rendering) 있겠죠? 이전 글에 CRA, SSR, CSR, SSR.. 정말 많은 용어들
:를 이용하게 동적으로 사용 가능<NavLink>를 이용해 쉽게 구현 가능. isActive 또는 isPending을 사용해 쉽게 스타일을 적용할 수 있음<a href> 같이 <Link to> <NavLink to>는 중첩route를 이용해 상대 경로를 가질 수 있음HTML form은 link와 같은 navigation event가 발생하지만 React Router는 CSR HTML form을 지원, form 제출시 navigatioin event를 막고 body에 있는 FormData를 제출, 이 요청은 <Form action>과 <Route action>에 매칭되는 곳에 보내짐, 폼 제출시 busy indicator, disable fildset등 표시 가능
React Router는 스크롤 전에 data loading을 기다릴때의 browser scroll restoration을. emulate함, 이렇게하면 스크롤의 위치가 올바른 곳으로 복원됨
이외에도 여러개있지만.. 여기까지만 작성하고 특징이 비슷한것은 하나에 묶었다.
React Router Overview document
사실 이문서만 읽었을 때 이게 정말 무슨말이지.. 하는 생각이 많이 들었다. 다른 블로거들을 보면서 React Router설명을 보고 보니 이제 이해가 가는 친구들.. 뜬구름 잡는 이야기 같았는데 정리가 되고나니 오~~ 이러기능도 있어~~ 오~ 이런 것도 있어~ 하면서 문서를 재밌게 읽고 정리했다.정리하기 전까지 재미 없었다는 이야기 수업시간에 배운 내용은 정말 코딱지의 코딱지의 코딱지 만했다는 것을 깨닫고... 공부를 정말 많이해야겠다는 생각이 많이들었다.. ㅠ
React Router는 신규페이지를 불러오지 않는 상황에서 각각의 url에 따라 선택된 데이터를 하나의 페이지에서 렌더링 해주는 라이브러리npm install react-router-domreact-router-dom은 웹에서 사용, react-router-native은 앱에서사용, react-router는 웹과 앱 둘 모두 사용이라고 한다. 나는 web에서 사용할거니까 react-router-dom@6설치예정V6.4부터는
<BrowserRouter?,<MemoryRouter>,<HashRouter>,<NativeRouter>,<StaticRouter>를 지원하지 않는다. 대신createBrowserRouter,createMemoryRouter, >createHashRouter,createStaticRouter지원.
레거시 코드를 읽으려면 이전버전을 공부해야하고 새로운 버전도 공부해야한다는 말이죠?
: HTML5를 지원하는 브라우저 주소 감지
: url의 해쉬(#)값을 이용하는 라우터
SEO(검색 엔진 최적화)
BrowserRouter
Routes
Route
<Element />형식으로 전달Link
to속성에 경로를 넣어주는 방식으로 사용./..와 같은 표현도 사용 가능useLocation 훅과 연계하여 특정 state를 넘겨주는 것도 가능<NavLink
to="/messages"
className={({ isActive, isPending }) =>
isPending ? "pending" : isActive ? "active" : ""
}
useNavigate
중첩 라우팅
<Route path="/about" element={<About />}>
<Route path="location" element={<Location />}></Route>
</Route>
라우터 내부에 자식요소 Route를 만들어준다. /about 주소 하위에 /location이라는 주소가 하위 라우팅 되었다고 판단한다. /about/location으로 이동할 경우 Location 컴포넌트로 렌더링된다(물론 About 컴포넌트도 같이 렌더링 됨)
라우처에서 위와 같이 설정한 것만으로 아무변화가 생기지 않는다
실제로 해당 라우팅이 발생한 부모 요소인 About 페이지에 하위 라우팅 발생시 컴포넌트를 렌더링할 자리를 명시해주어야 하기 때문이고, 이 때 사용 되는 것이 Outlet 컴포넌트이다
Outlet
import { Outlet } from 'react-router-dom';
function About() {
return (
<div>
<div>
<h2>여기는 About 페이지입니다.</h2>
<p>대충 쇼핑몰 페이지라는 뜻</p>
</div>
<Outlet />
</div>
);
}
About 컴포넌트 내부에 outlet컴포넌트를 렌더링해준다면 라우터에서 이를 인식하고 주소가 일치하는 경우 Outlet자리에 location 컴포넌트를 렌더링 함
Outlet없이 중첩 라우팅 구현하기
*을 추가해 중첩 라우팅이 발생할 주소임을 명시<Routes>
<Route path="/" element={<Home />}></Route>
<Route path="/about/*" element={<About />}></Route>
<Route path="/products" element={<Products />}></Route>
</Routes>
이 후 해당 About 컴포넌트에서 본래 Outlet이 들어갔던 자리에 마치 라우터를 구현 했던 것처럼 중첩 라우팅을 진행해주면 된다.
function About() {
return (
<div>
<div>
<h2>여기는 About 페이지입니다.</h2>
<p>대충 쇼핑몰 페이지라는 뜻</p>
</div>
<Routes>
<Route path="/location" element={<Location />}></Route>
</Routes>
</div>
);
}
위와같이 작성하면 Outlet과 동일한 기능을 하는 중첩 라우팅 구현 가능
주소 : http://helloworld.com/hi/1
<Route path="/hi/:id" element={}>
여기서 :로 구분해준 id라는 값은 파라미터로 전달되어 Element 컴포넌트 내부에서 useParams훅을 통해 가져와 사용 가능, 1이 전달됨, 여러개 전달도 가능
import React from 'react';
import { useParams } from 'react-router-dom';
const NewId = () => {
let { id } = useParams();
return (
<div className="test">
<p>현재 유저의 아이디는 { id } 입니다.</p>
</div>
)
}
export default NewId;
? &를 기준 으로 key, value형태로 데이터를 전달, 이렇게 전달 받은 후 useLocation 훅을 통해 추출하고 사용 가능
이전까지는 ? &를 직접 분리하고 값을 가져와 사용했어야했는데 useSearchParams를 사용하면 쉽게 사용 가능
현재 위치에 대한 url의 쿼리스트링을 읽고 수정할 때 사용
useState와 사용법이 유사
serchParams는 URLSearchParams 객체이면서 쿼리스트링을 다루기 위한 다향한 메서드를 내장하고 있음
setSearchParams는 함수의 인자에 객체와 문자열을 넣어주면 현재 url의 쿼리스트링을 변경하는 기능을 제공
값을 읽어오는 메서드
searchParams.get(key) : 특정한 key의 value를 가져오는 메서드, 해당 key의 value가 두개 이상이하면 첫번째 값을 반환
searchParams.getAll(key) : 특정 key의 모든 value를 가져오는 메서드
값을 변경하는 메서드
setSearchParams.set(key, value) : 인자로 전달한 key값을 value로 설정한다. 기존의 key가 존재한다면 value를 덮어씌움
setSearchParams.append(key, value) : 기존 값을 변경 혹은 삭제하지 않고 축함
searchParams를 변경하는 메서드로 값을 변경하더라도 실제 url에는 이 정보가 반영되지 않는다. 만약 이를 변경하고자 한자면 setSearchParams에 searchParams를 인자로 전달해줘야한다. ???????????
const [serchParams, setSearchParams] = useSearchParams();
| URL 파라미터 | 쿼리스트링 |
|---|---|
| ID, 이름, 특정 데이터를 조회할 때 사용 | 키워드 검색, 페이지네이션, 정렬방식 등 데이터 조회에 필요한 옵션을 전달할 때 사용 |
| 일반적인 변수, 상수 값들을 전달하기 용이 | key, value 형태의 데이터 이므로 json이나 객체 형태의 데이터를 전달하기에 용이 |