useState()
사용해 상태 관리useEffect()
사용해 코드 실행 타이밍 관리https://api.coinpaprika.com/v1/tickers
2가지 state를 만들어보자.
먼저 로딩 state를 만들고 코인 api를 가져오자.
import { useEffect, useState } from "react";
function App() {
//✅ 2가지 state를 만들어보자.
//✅ 1. 로딩, 기본 값 true인 state
const [loading, setLoading] = useState(true);
//코인 api 컴포넌트
//처음 렌더되었을 때만 실행되도록 아무 state도 주시하지 않도록, 즉 [] 빈 어레이를 작성하면 된다.
useEffect(() => {
//코인 api를 fetch한다.
//코인 api를 fetch하고 네트워크를 확인하면 request/response가 잘되고 있음을 확인할 수 있다.
fetch("https://api.coinpaprika.com/v1/tickers");
}, []);
return (
<div>
<h1>The Coins!</h1>
{loading ? <strong>Loading...</strong> : null}
</div>
);
}
export default App;
콘솔 > 네트워크 > 새로고침
후 tickers
를 눌러보면 request 200 GET한 것을 알수 있다.
그리고 preview
를 보면 코인이 json형태로 적혀 있는 것을 확인할 수 있다.
이 response로부터 코인의 json을 추출해 보자.
useEffect(() => {
fetch("https://api.coinpaprika.com/v1/tickers")
.then((response) => response.json())
.then((json) => console.log(json));
}, []);
와우 쏘 매니...엄청 큰 배열을 반환한다.
이게 우리가 사용할 data이다.
이제 이 data를 component에서 보여주면 된다.
이 data를 component에서 보여주기 위해서는 이 data를 state에 넣으면 된다.
const [coins, setCoins] = useState([]);
.then((json) => setCoins(json)
useEffect(() => {
//코인 api를 페치한 후(then), response를 받아서 response.json을 return하면(then),
//엄청 큰 배열 반환된다는 사실을 콘솔로그로 봤었다.
//그 json === 코인 데이터 배열
//따라서 반환되는 json의 값을 setCoins해서 coins에 값을 업뎃하면 된다.
fetch("https://api.coinpaprika.com/v1/tickers")
.then((response) => response.json())
.then((json) => setCoins(json));
}, []);
useEffect(() => {
fetch("https://api.coinpaprika.com/v1/tickers")
.then((response) => response.json())
.then((json) => {
setCoins(json);
setLoading(false);
});
}, []);
모디파이어 함수 사용해서 data를 바꿀 수 있다니 너무 멋지다! 🥺
이제 coins라는 변수에 코인들의 array가 담겨져 있다.
array.map()
을 사용하여 array의 각 item을 component로 만들자.
<ul>{coins.map((coin) => <li>{coin}</li>)}</ul>
<ul>
{coins.map((coin) => (
<li>
{coin.rank}. {coin.name}({coin.symbol}): {coin.quotes.USD.price} USD
</li>
))}
</ul>
array.length
를 사용하면 된다.<h1>The Coins! ({coins.length})</h1>
return (
<div>
<h1>The Coins! ({coins.length})</h1>
{loading ? <strong>Loading...</strong> : null}
<ul>
{coins.map((coin) => (
<li key={coin.id}>
{coin.rank}. {coin.name}({coin.symbol}): {coin.quotes.USD.price} USD
</li>
))}
</ul>
</div>
);
❗️여기서 잠깐
const [coins, setCoins] = useState([]);
이때 coins state의 기본 값으로 빈 배열을 안 넣어두면 컴포넌트의 처음 시작 때 coins은undefined
이 된다. 그러면 loading할 때 에러 뜬다. 게다가 undefined은 length를 가질 수도 없다.
적어도 빈 배열 둬서 undefined 안되게 처리해 두자!
import { useEffect, useState } from "react";
function App() {
//2가지 state
//🌟 1. 로딩, 기본 값 true
const [loading, setLoading] = useState(true);
//🌟 2. 코인 API의 데이터, 즉 코인 리스트 가지고 있는 state, 기본 값 빈 array(코인 리스트 배열이라서)
const [coins, setCoins] = useState([]);
//✅ 코인 API: 컴포넌트 처음 렌더되었을 때만 실행: 아무 state도 주시하지 않으면 된다.
useEffect(() => {
//코인 api를 fetch하고 네트워크를 확인하면 request/response가 잘되고 있는 것을 확인 할 수 있다.
//response로부터 코인의 json을 추출해 보자.
//- 코인 api를 페치한 후(then), response를 받아서 response.json을 return해 주면 된다.
//- 그러고 나서(then), 그 json을 가지고 콘솔로그 해보자.
//결과는 엄청 큰 배열 반환된다. = 코인 데이터 배열
//- 따라서 반환되는 json의 값을 setCoins해서 coins에 값을 업뎃시키자.
//- 그리고 동시에 loading을 false로 바꿔줘야 한다.
fetch("https://api.coinpaprika.com/v1/tickers")
.then((response) => response.json())
.then((json) => {
setCoins(json);
setLoading(false);
});
}, []);
const [] = useState();
return (
<div>
<h1>The Coins! ({coins.length})</h1>
{loading ? <strong>Loading...</strong> : null}
<ul>
{coins.map((coin) => (
<li key={coin.id}>
{coin.rank}. {coin.name}({coin.symbol}): {coin.quotes.USD.price} USD
</li>
))}
</ul>
</div>
);
}
export default App;
USD를 다른 코인으로 바꾸면 코인을 몇 개 살수 있는지 구하기
import { useEffect, useState } from "react";
function App() {
//2가지 state
//🌟 1. 로딩, 기본 값 true
const [loading, setLoading] = useState(true);
//🌟 2. 코인 API의 데이터, 즉 코인 리스트 가지고 있는 state, 기본 값 빈 array(코인 리스트 배열이라서)
const [coins, setCoins] = useState([]);
//🌟 3. usd 인풋 state
const [usd, setUsd] = useState(0);
//🌟 4. 선택한 코인 state
const [pick, setPick] = useState(0);
// usd 인풋에 입력한 값 받아와 usd 업데이트
const usdChange = (event) => setUsd(event.target.value);
// 픽한 코인 value(코인의 usd가격) 받아와 pick 업데이트
const onSelect = (event) => {
setPick(event.target.value);
};
//✅ 코인 API: 컴포넌트 처음 렌더되었을 때만 실행: 아무 state도 주시하지 않으면 된다.
useEffect(() => {
//코인 api를 fetch하고 네트워크를 확인하면 request/response가 잘되고 있는 것을 확인 할 수 있다.
//response로부터 코인의 json을 추출해 보자.
//- 코인 api를 페치한 후(then), response를 받아서 response.json을 return해 주면 된다.
//- 그러고 나서(then), 그 json을 가지고 콘솔로그 해보자.
//결과는 엄청 큰 배열 반환된다. = 코인 데이터 배열
//- 따라서 반환되는 json의 값을 setCoins해서 coins에 값을 업뎃시키자.
//- 그리고 동시에 loading을 false로 바꿔줘야 한다.
fetch("https://api.coinpaprika.com/v1/tickers")
.then((response) => response.json())
.then((json) => {
setCoins(json);
setLoading(false);
});
}, []);
return (
<div>
<h3>USD to Coins! {loading ? "" : `(${coins.length})개의 코인`}</h3>
{loading ? (
<strong>Loading...</strong>
) : (
<div>
<input
value={usd}
type="number"
placeholder="USD"
onChange={usdChange}
min="0"
></input>
$ 가 있으면{" "}
<select onChange={onSelect}>
<option>코인을 고르세요!</option>
{coins.map((coin) => (
<option key={coin.id} value={coin.quotes.USD.price}>
{coin.name}({coin.symbol})
</option>
))}
</select>
코인 <b>{pick ? `${usd / pick}` : "-"}</b>개를 살 수 있습니다.
</div>
)}
</div>
);
}
export default App;