// 2. IIFE로 굳이 getCoins 함수를 또 만들 필요 없이 즉시 실행
useEffect(() => {
(async () => {
const json = await (
await fetch("https://api.coinpaprika.com/v1/coins")
).json();
})();
}, []);
📌 Coin Detail - Route States
현재까지 개발된 상황
1. Coins Home 페이지에서 Loading 문구가 최초로 노출됨
2. 그 사이에 API request가 종료되면 코인 리스트를 가져올 수 있게 되고 Loading 문구는 사라지고 코인 리스트 UI 노출
3. 특정 코인을 클릭하면 Coin Detail 페이지로 이동 (ex. /btc)
4. 페이지 이동 후, 코인 name 제목이 여전히 특정 코인 데이터를 가져오는 동안 Loading 문구 노출됨
Coin Detail 페이지에서 코인 name 제목은 나도 아는 데이터임에도 불구하고 API가 줄 때까지 사용자는 로딩 문구를 봐야 함 -> 좋은 UX가 아님
비하인드 더 씬 데이터
우리는 그동안 한 화면에서 다른 화면으로 데이터를 전송할 때 URL Parameter를 보내는 방식을 사용해 왔음
하지만 위와 같은 이슈가 있어서 state를 사용해보자
// Coins.tsx
// react-router-dom v6점대 이상부터 아래처럼 사용
<Link to={`/${coin.id}`} state={{ name: coin.name }}>
// Coin.tsx
// Link에서 state로 넘겼던 coin.name을 Coin에서 useLoaction을 사용해서 get
// react-router-dom v6점대 이상부터 <> generic 미지원, 아래처럼 사용 가능
interface RouteStates {
state: {
name: string;
};
}
function Coin() {
const {
state: { name }
} = useLocation() as RouteStates;
return (
<Container>
<Header>
<Title>{name}</Title> // 더이상 useParmas로 가져온 coinId가 아닌 coin의 name을 직접 뿌려줄 수 있음
</Header>
</Container>
);
}
state는 Coins Home 페이지를 열 때 & Coin Detail 페이지로 넘어갈 때 생성됨
state는 Coins Home 페이지에서 특정 코인을 클릭해서 이동할 때, Home에서 Detail 페이지로 보내짐
Uncaught TypeError: Cannot read properties of null (reading 'name')
크롬 시크릿창에서 Coin Detail 페이지로 바로 접속하면 위와 같은 오류 발생
state가 생성되려면 Coins Home부터 열어야 그 state를 클릭시 Detail 페이지로 전송 가능
Javascript의 Optional Chaining 연산자(?.)를 사용해서 name에 접근하기 전에 state의 상태에 따라 다르게 반환됨
state가 있다면 name 그대로 반환, null or undefined라면 자동으로 단락되어 undefined가 반환됨
📌 Coin Detail - Data Types
보통 Interface는 네이밍을 맨 앞에 I를 붙임
API 데이터의 Interface 정의 시 미세먼지 팁
// 1. 아래 key 복사
temp1 = { API 데이터 };
Object.keys(temp1).join(); // 'id, name, symbol...'
// 2. VSCode에 붙여넣고 Command + D로 콤마 선택해서 삭제 후 엔터
// 전체 영역 선택 후, Command + Shift + i로 각 모든 커서를 받아서 공통 문자 :와 ; 입력
// 3. 아래 values의 type 복사
Object.values(temp1).map(item => typeof item).join(); // 'string, string, boolean...'
// 4. 2번처럼 콤마 선택해서 삭제 후 엔터
// 5. 2번까지 마친 key를 전체 선택 후, Comand + Shift + i로 각 모든 커서가 나오면 4번 key 붙여넣기
// 6. But array같은 경우 object로만 type 변환이 되어서 내부 속성들의 타입도 명시해줘야 함
interface ITag {
coin_counter: number;
id: string;
...
}
interface IInfoData {
id: string;
name: string;
tag: ITag[];
...
}
📌 react-query
react-query
: 편한 방식으로 데이터를 fetch 할 수 있는 패키지Setup
react-router-dom
&react-query
installreact-router-dom
: 어플리케이션이 URL을 가져서 각기 다른 화면을 갖게 해줌@types/react-router-dom
설치react-router-dom
Switch
대신Routes
로 사용📌 Styles
Reset Style
1. styled-reset
2. createGlobalStyle
Fragment
Font
Theme
📌 Coins Home
API fetch
📌 Coin Detail - Route States
현재까지 개발된 상황
비하인드 더 씬 데이터
Uncaught TypeError: Cannot read properties of null (reading 'name')
해결 방안
📌 Coin Detail - Data Types
I
를 붙임📌 Coin Detail - Nested Routes
Nested Route
useMatch hook
📌 React Query
QueryClientProvider
안에 있는 모든걸 하위 컴포넌트에서 접근 가능함 (ThemeProvider와 같은 맥락)Why use react-query
useQuery
hook은 fetcher 함수를 호출하고 fetcher 함수가 loading 중이라면 react-query는 isLoading으로 로딩 여부를 알려줄것Devtools
allCoins
쿼리 확인 가능, 원하는 동작 트리거 가능 -> reqct-query가 query를 array로 보고 있음 ["allCoins"]Coin에 react-query 적용
📌 Price Chart
Apexchart.js
react-helmet
Warning: Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code.
오류 발생HelmetProvider
로Helmet
을 감싸서 사용