홈페이지 만들기!
코인 랭킹 1위부터 100위까지 나오는 메인페이지를 만들어보자.
Link
를 사용해 리스트에서 bitcoin 버튼을 클릭하면 bitcoin 페이지로 이동하게 만들어주자import { Link } from "react-router-dom";
function Coins() {
return (
<Container>
<Header>
<Title>코인</Title>
</Header>
<CoinsList>
{coins.map((coin) => (
<Coin key={coin.id}>
<Link to={`/${coin.id}`}>{coin.name} →</Link>
</Coin>
))}
</CoinsList>
</Container>
}
- Coins.tsx
interface ICoin {
id: string;
name: string;
symbol: string;
rank: number;
is_new: boolean;
is_active: boolean;
type: string;
}
- Coins.tsx
function Coins() {
const [coins, setCoins] = useState<ICoin[]>([]);
// coins state가 coins 로 이루어진 array 라고 알려주기
const [loading, setLoading] = useState(true);
useEffect(() => {
(async () => {
const response = await
fetch("https://api.coinpaprika.com/v1/coins");
const json = await response.json();
setCoins(json.slice(0, 100));
setLoading(false);
})();
}, []);
return (
...
Link
태그를 통해 보내주자 (url이 아닌 보이지 않는 방식, 비하인드더씬 방식이랄까)- Coins.tsx
...
<Link
to={`/${coin.id}`}
state={{ name: coin.name }}
>
<Img
src={`https://cryptoicon-api.vercel.app/api/icon/${coin.symbol.toLowerCase()}`}
/>
{coin.name} →
</Link>
<Link to={} state={} >
처럼 사용하도록 바뀌었기에, 참고하여 작성했다.Coins.tsx
페이지를 만들었을때와 유사하므로 코드를 복사해서 붙여왔다.- Coin.tsx
function Coin() {
const { coinId } = useParams<RouteParams>();
// 똑같이 url 의 변수 불러와주고
const [loading, setLoading] = useState(true);
// coin 페이지도 정보 불러올 동안 loading 띄워줘야하니 필요하구
const { state } = useLocation<RouteState>();
return (
<Container>
<Header>
<Title>코인 {coinId}</Title>
</Header>
{loading ? <Loader>Loading...</Loader> : null}
</Container>
);
}
Link
태그를 통해 불러왔던{coinId}
를 {state.name}
으로 바꿔주려한다.const location = useLocation();
console.log(location);
위와 같이 작성하면,
- Coin.tsx
function Coin() {
const { coinId } = useParams<RouteParams>();
const [loading, setLoading] = useState(true);
const { state } = useLocation<RouteState>(); <<<----
return (
<Container>
<Header>
<Title>{state?.name || "Loading..."}</Title> <<<----
</Header>
{loading ? <Loader>Loading...</Loader> : null}
</Container>
);
}
|| "Loading..."
이 있는 이유?state.name
값이 없어서!!