🚨 이 글은 노마드 React JS 마스터 강의를 본 후 정리한 글입니다. 강의 내용에 대한 언급 없이 강의를 보면서 새로 익힌 Hooks나 Componenet, Library 등을 간략하게 정리한 글입니다.
터미널에서 원하는 폴더에 들어간 뒤 명령어를 실행시켜줍니다.
(업데이트 때문에 버전을 설정하지 않고, 설치를 하면 오류도 많이 뜨고 새로운 문법에 맞춘다고 시간을 너무 잡아먹기 때문에 특정 버전 정해놓고 사용하는게 좋을 것 같습니다.😢)
npx create-react-app{project-name} --template typescript
npm install --save react@^17.0.2 react-dom@^17.0.0
src
public
파일 삭제 후 App.tsx, index.tsx, index.html
파일 내부도 깔끔하게 정리해줍니다.
여러가지 패키지를 설치 할 때는 띄어쓰기로 구분해 작성해주면 한번에 설치가 가능합니다.
React Router 6버전으로 진행 시 @types/react-router-dom를 설치하지 않아도 타입을 불러옵니다.
styled-components도
npm i react-query
npm i @types/styled-components
css를 초기화하는 방법에는 여러가지가 있습니다.
1. .css파일에 초기화 코드를 붙여넣기
2. styled-reset 패키지를 설치 후 component를 가져오기
npm i styled-reset
App.tsx
import { Reset } from 'styled-reset';
function App() {
return (
<>
<Reset />
</>
);
}
export default App;
import { createGlobalStyle } from 'styled-components';
import reset from 'styled-reset';
const GlobalStyled = createGlobalStyle`
${reset}
* {
box-sizing: border-box;
}
a {
color: inherit;
text-decoration: none;
}
`;
export default GlobalStyled;
테마는 공통적으로 사용되는 스타일을 테마로 묶어 코드의 일관성을 지킬 수 있도록 합니다.
.d.ts를 타입선언파일
이라 하며, ts코드의 타입 추론을 돕는 파일DefaultTheme
이라는 이름의 인터페이스를 생성해 타입을 작성import "styled-components";
declare module "styled-components" {
export interface DefaultTheme {
textColor: string;
bgColor: string;
accentColor: string;
}
}
import { DefaultTheme } from "styled-components";
export const theme: DefaultTheme = {
bgColor: "#2f3640",
textColor: "#f5f6fa",
accentColor: "#9c88ff",
};
import {theme} from './theme';
v6로 업데이트 되면서 Switch 대신 Routes를 사용합니다.
만약 react-router-dom
부분에서 에러가 난다면 다음 명령어를 실행 시켜줍니다.
npm i --save-dev @types/react-router-dom
Router.tsx
import { BrowserRouter, Routes, Route } from "react-router-dom";
function Router() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Coins />} />
</Routes>
</BrowserRouter>
);
}
URL의 파라미터 부분을 잡아내고 싶을 때 사용합니다.
URL Parameter
가 무엇이냐면 Router파일에 작성한 :coinId
자리에 입력한 주소값입니다.
import { useParams } from "react-router-dom";
const { coinId } = useParams();
상단에 꼭 import 해주고 v6부터는 interface로 타입을 명시해주지 않아도 알아서 coinId를 string | undefined로 타입을 설정합니다.
앞서 말한 useParams과 비슷한 훅스입니다. useParams는 path parameter
정보를 가져오고, useLocation은 query string
정보를 얻어옵니다.
console.log(location)
을 찍어보면 여러가지가 출력되는데 그중, pathname
과 search
객체가 출력되는 것을 볼 수 있습니다.
pathname
은 URL이 http://localhost:3000/btc-bitcoin 이라고 했을 때, query string을 제외한 /btc-bitcoin
이 출력됩니다.
search
는 pathname이 출력했던 부분을 제외한 query string
이 출력됩니다.
하지만 실제 작업에서는 state 객체를 추가해서 넘겨줬기 때문에 state값을 가져와야하는데 이때는 아래와 같이 작성해줍니다.
import { useLocation} from "react-router-dom";
inertface RouteState {
name: string;
}
function Coin() {
const location = useLocation();
const name = location.state as RouteState;
return();
}
사용자가 특정한 URL에 있는지 여부를 알려주는 훅스입니다.
v6로 업데이트 되면서 기존에 useRouteMatch()가 없어지고 useMatch()를 이용해야합니다.
우리가 useMatch("ULR")에게 URL을 작성하면 특정한 URL이 있는지 확인해달라고 요청을 하게됩니다.
const chartMatch = useMatch("/:coinId/chart");
const priceMatch = useMatch("/:coinId/price");
<Tab isActive={chartMatch !== null}>
<Link to={`/${coinId}/Chart`}>Chart</Link>
</Tab>
npm i react-query
import { QueryClient, QueryClientProvider } from "react-query";
const queryClient = new QueryClient();
ReactDOM.render(
<React.StrictMode>
<QueryClientProvider client={queryClient}>
<ThemeProvider theme={theme}>
<App />
</ThemeProvider>
</QueryClientProvider>
</React.StrictMode>,
document.getElementById('root')
);
api.ts 파일을 생성
후 fetcher 함수 작성// ver. promise
export function fetchCoins() {
return fetch(https://api.coinpaprika.com/v1/coins).then(response => response.json());
}
// ver. async / await
export async function fetchCoins() {
return await (await fetch("https://api.coinpaprika.com/v1/coins")).json();
}
const {isLoading, data} = useQuery<{interface-name}>("key(고유식별자)", fetcher-func)
isLoading은 true 또는 false인 boolean 값으로 서버의 데이터들이 모두 로딩되면 boolean값을 리턴합니다.
이 때, useQuery()에는 두가지 인자가 들어가는데 하나는 key = query의 고유 식별자, 또 하나는 fetcher 함수가 들어갑니다.
🚨 만약 useParams를 사용한다면 fetcher 함수에 변수를 넘겨주고
export function fetcher(변수: string | undefined) {
return fetch(...).then(response => response.json());
}
본래 파일로 돌아와서 아래와 같이 작성해 줍니다.
const {변수} = useParams();
const { isLoading, data } = useQuery(["변수의 key", 변수], () => fetchCoinInfo(변수));
부모 route의 path 마지막에 /*
을 작성해줘서 이 route의 내부에서 nested route가 render 될 수도 있음을 표시한 뒤 자식 route를 부모 route의 element내부에 작성하는 것
Router.tsx
<Route path="/:coinId/*" element={<Coin />} />
Coin.tsx
<Link to={`/${coinId}/chart`}>Chart</Link>
<Link to={`/${coinId}/price`}>Price</Link>
<Routes>
<Route path="chart" element={<Chart />} />
<Route path="price" element={<Price />} />
</Routes>
현대적이고 인터랙티브한 오픈 소스 차트 (https://apexcharts.com)
npm install --save react-apexcharts apexcharts
import ApexChart from "react-apexcharts";
<ApexChart />
다음 props들을 사용해 꾸밀 수 있습니다.
series의 이름과 데이터는 필수로 입력해야지만 차트가 나타납니다.
type
차트 유형 (String) / 기본값 ‘line’
series
차트에 표시하려는 데이터 (Array) / 기본값 undefined
width, height
차트의 너비 (String || Number) / 기본값 ‘100%’
차트의 높이 (String || Number) / 기본값 auto
options
차트의 구성 옵션 (Object) / 기본값 {}
웹 문서의 헤더 값을 변경할 때 사용하는 리액트 컴포넌트 이다.
npm i react-helmet
npm i --save-dev @types/react-helmet
import { Helmet } from "react-helmet-async";
<Helmet>
<title>Helmet 사용법</title>
</Helmet>