목표!
암호화폐 추적 기능 만들기 :)
강의는 react-router-dom 5.3 버전을 사용했지만
나는 최신 router-dom 을 배우는 것이 더 낫다고 생각되어 6.4 버전으로 진행.
coinpaprika API 를 사용해서 만든다.
코인 트래커 app 을 만들기 전 준비작업.
router 기반 만들기
- Router.tsx
import { BrowserRouter, Routes, Route } from "react-router-dom";
function Router() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Coins />}></Route>
<Route path="/:coinId" element={<Coin />}></Route>
</Routes>
</BrowserRouter>
);
}
- App.tsx
import Rotuer from "./Router";
function App() {
return <Router />
}
path="/:coinId"
Router 에게 우리의 url 이 변수값을 가진다는걸 말했으니useParams
로 변수 값을 가져오자.- Coin.tsx
function Coin() {
const params = useParams(); <<<----
...
console.log(params)
로그를 본다면 결과값으로 'btc'가 나와야함.coinId
만 꺼내쓰자.- Coin.tsx
function Coin() {
const { coinId } = useParams(); <<<----
...
- Coin.tsx
interface RouteParams {
coinId: string;
}
function Coin() {
const { coinId } = useParams() as unknown as RouteParams;
...
"'Readonly<Params>' 형식을 'RouteParams' 형식으로 변환한 작업은 실수일 수 있습니다. 두 형식이 서로 충분히 겹치지 않기 때문입니다. 의도적으로 변환한 경우에는 먼저 'unknown'으로 식을 변환합니다.
'coinId' 속성이 'Readonly<Params>' 형식에 없지만 'RouteParams' 형식에서 필수입니다.ts(2352)"
unknown 은 Typescript의 탑 타입(Top Type)입니다. 따라서 Typescript에 있는 모든 타입을 포함하여 어느 값이든 가질 수 있습니다.
unknown 을 사용하는 것은 컴파일러에게 "이 변수는 어떤 타입이될지몰라 너가 추론해줘" 라고 이야기해주는 것과 같습니다.
createGlobalStyle
를 사용const globalStyle = crateGlobalStyle`
...css reset...
`;
function App() {
return (
<>
<GlobalStyle />
<Router />
</>
);
}
- theme.ts
import { DefaultTheme } from "styled-components";
export const theme: DefaultTheme = {
bgColor: "#191e36",
textColor: "#f5f6fa",
accentColor: "#fcff9d",
};
- index.tsx
import { ThemeProvider } from "styled-components";
import App from "./App";
import { theme } from "./theme";
const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement
);
root.render(
<ThemeProvider theme={theme}>
<App />
</ThemeProvider>
);
const Title = styled.h1`
color: ${props => props.theme.accentColor};
`;