오늘은 리액트의 꽃 SPA와 만드는데 도움되는 Router 라이브러리를 공부하고 어제 만들었던 Twittler에 적용해보는 연습을 할 것이다!
- SPA(Single-Page Application) 개념을 이해하고 설명
- SPA의 장, 단점에 대해 이해하고 설명
- 와이어프레임을 보고 어느 부분을 컴포넌트로 구분할지 스스로 결정
결론 : 재사용하는 컴포넌트, 한번만 사용되는 컴포넌트 등을 구별해 사용하자! 다시 말해 컴포넌트들끼리 보다 유기적으로 주고받을 수 있도록 설계하자!
- React에서 npm으로 React Router를 설치(npm install react-router-dom(@6.3.0))하고 이용
- React Router를 이용하여 SPA를 구현
- 라우팅 구조를 짤 수 있어야 하고, 이에 필요한 기초 문법들을 사용
SPA에선 페이지를 바꿀 때 페이지 자체가 바뀌어지지 않고 각 구역마다 다른 컴포넌트 다른 기능을 보여준다고 배웠다. 그렇다면 '바뀌어지는 단서'가 있어야 JS가 맞춰서 HTML 요소를 생성할 것이다. 여기서 그 '단서'를 리액트는 '주소'로 판단한다.
BrowserRouter
Routes
와 Route
Link
npm i react-router-dom(@^버전)
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
import React from "react";
import { BrowserRouter, Routes, Route, Link } from "react-router-dom";
// Home 컴포넌트
function Home() {
return <h1>Home</h1>;
}
// MyPage 컴포넌트
function MyPage() {
return <h1>MyPage</h1>;
}
// Dashboard 컴포넌트
function Dashboard() {
return <h1>Dashboard</h1>;
}
function App() {
return (
<div>
<nav>
<ul>
<li>Home</li>
<li>MyPage</li>
<li>Dashboard</li>
</ul>
</nav>
</div>
);
}
export default App;
<BrowserRouter>
// 2가지 선택 가능
// App.js
function App() {
return (
<BrowserRouter>
<div>
<nav>
<ul>
<li>Home</li>
<li>MyPage</li>
<li>Dashboard</li>
</ul>
</nav>
</div>
</BrowserRouter>
);
}
// index.js
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>
);
<Routes>
, <Route>
Routes
: Route를 감싸 일치하는 단 하나의 라우터만을 매칭시켜주게 만듬, 안쓰면 모든 요소가 렌더링;;Route
: Path
속성을 지정해 해당 Path
에 어떤 컴포넌트를 보여줄지 지정, Link
컴포넌트와 동일해야 실행 가능<BrowserRouter>
<div>
<nav>
<ul>
<li>Home</li>
<li>MyPage</li>
<li>Dashboard</li>
</ul>
</nav>
{/* 주소 경로와 아까 만든 3개의 컴포넌트를 연결 */}
{/* Routes 컴포넌트는 Route 컴포넌트들을 감싸고 있어야 함 */}
<Routes>
{/* 경로는 path로 컴포넌트는 element로 연결 */}
{/* <Route path="*" element={<Home />} /> */}
<Route path="/" element={<Home />} />
<Route path="/mypage" element={<MyPage />} />
<Route path="/dashboard" element={<Dashboard />} />
</Routes>
</div>
</BrowserRouter>
팁: 사용자가 지정한 주소 이외의 주소(“/’, “/mypage”, “/dashboard”)로 접근한다면 의도된 화면이 안보일 때가 있다! 가장 메인이 되는 컴포넌트 같은 곳에 path=”*”
를 한다면 이 속성이 설정돼 있는 컴포넌트를 보여주게 된다!
<Link>
<a>
요소로 바뀜<a>
는 기본적으로 전체를 새로고침하지만 <Link>
는 페이지 전환을 방지하는 기능이 내장돼있어 SPA에 더 적합!<Link>
의 to
속성을 활용하여 <Route>
컴포넌트에 설정해 준 path
주소를 연결<ul>
<li>
{/* Link 컴포넌트를 이용하여 경로를 연결 */}
<Link to="/">Home</Link>
</li>
<li>
<Link to="/mypage">MyPage</Link>
</li>
<li>
<Link to="/dashboard">Dashboard</Link>
</li>
</ul>
- npm 을 이용해 react-router-dom을 설치
- 컴포넌트 단위로 Client-side routing 가능
- react-router-dom 를 활용하여 Twittler SPA를 구현
어제 만들었던 과제에 라우터를 넣은 SPA를 만들어보자!
깃에서 포크 해오고~ 클론하고~ 패키지 깔고~ 라우터도 깔고~ 컴포넌트 불러오자!
├── /Twittler React SPA
│ ├── README.md
│ ├── /public # create-react-app이 만들어낸 파일
│ └── /src # React 컴포넌트
│ ├── static # dummyData
│ │ └── dummyData.js
│ ├── Pages # 페이지를 표시하는 컴포넌트가 들어가는 폴더
│ │ ├── About.css
│ │ ├── About.js
│ │ ├── MyPage.css
│ │ ├── MyPage.js
│ │ ├── Tweets.css
│ │ └── Tweets.js # 저번에 했던 트윗 내용이랑 같음
│ ├── App.css
│ ├── App.js
│ ├── Footer.js
│ ├── index.js
│ └── Sidebar.js
├ package.json
└ .gitignore
useNavigator
: 특정 행동을 하면 어떤 결과를 보여주는 라이브러리 - 특히 로그인 했는지 안했는지 상태(state)를 지정할 때 유용NavLink
: Link 대신 NavLink를 사용해 포커스되면 확대되고 그런 느낌으로 사용해 더 나은 EX를 제공할 수 있음