#7.0~ 7.2 React를 이용해 간단한 To-Do를 만들어 보자!
function App() {
return <div></div>;
}
export default App;
import { useState } from 'react';
function App() {
const [toDo, setToDo] = useState('');
const onChange = (event) => setToDo(event.target.value);
const onSubmit = (event) => {
event.preventDefault();
if(toDo === "") { //input이 비어 있으면 함수를 실행시키지 않음
return;
}
setToDo(""); // input을 비워줌
};
return (
<div>
<form onSubmit={onSubmit}>
<input
onChange={onChange}
value={toDo}
type="text"
placeholder="Write your to do..."
/>
<button>Add To Do</button>
</form>
</div>
);
}
export default App;
input
값을 컨트롤 하는 방법const [toDo, setToDo] = useState('');
로 디폴트값을 ''
로 해줌input
에 value
로 toDo
를 주고, onChange를 넣는데 onChange함수를 만들어서 넣어줌.<form>
태그를 만들어 input
이랑 <button>
태그를 넣어줌<form>
은 submit 이벤트를 갖고 있어서 <button>
을 누르면 <form>
이 submit되고 새로고침됨.event.preventDefault();
를 사용해야함toDo
의 값이 변할 때마다 변경함수인 setToDo
가 값을 갱신해줌.function App() {
const [toDo, setToDo] = useState("");
const [toDos, setToDos] = useState([]);
const onChange = (event) => setToDo(event.target.value);
const onSubmit = (event) => {
event.preventDefault();
if (toDo === "") { //input이 비어 있으면 함수를 실행시키지 않음
return;
}
setToDos((currentArray) => [toDo, ...currentArray]);
setToDo(""); // input을 비워줌
};
console.log(toDos);
return (
<div>
<h1>My To Dos ({toDos.length})</h1>
<form onSubmit={onSubmit}>
<input
onChange={onChange}
value={toDo}
type="text"
placeholder="Write your to do..."
/>
<button>Add To Do</button>
</form>
</div>
);
}
const [toDos, setToDos] = useState([]);
코드를 작성해줌setToDos((currentArray) => [toDo, ...currentArray]);
: 첫번째 argument로 현재의 state를 받아서 toDo
의 저장되어있는 값과 빈array인 toDos
를 합쳐서 하나의 array로 만듬. state 변경 함수를 사용할 때는 2가지 옵션이 있음
1. setToDo("")
: 이런식으로 단순히 값을 직접 넣는것
2. setToDos((currentArray) => [toDo, ...currentArray])
: 함수를 보내는 방법
.map() 함수
: 함수의 첫번째 argument로 현재의 요소들(item)을 가져와서 조건에 맞게 새로운 array로 출력하는 함수. array 요소의 갯수만큼 출력함.function App() {
const [toDo, setToDo] = useState("");
const [toDos, setToDos] = useState([]);
const onChange = (event) => setToDo(event.target.value);
const onSubmit = (event) => {
event.preventDefault();
if (toDo === "") {
return;
}
setToDos((currentArray) => [toDo, ...currentArray]);
setToDo("");
};
console.log(toDos);
return (
<div>
<h1>My To Dos ({toDos.length})</h1>
<form onSubmit={onSubmit}>
<input
onChange={onChange}
value={toDo}
type="text"
placeholder="Write your to do..."
/>
<button>Add To Do</button>
</form>
<hr />
<ul>
{toDos.map((item) => (
<li >{item}</li>
))}
</ul>
</div>
);
}
.map()
함수를 작성하면 list가 출력됨<ul>
{toDos.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
key
속성을 넣어주면 해결됨! key
는 고유의 값(unique)이야 함..map()
의 두번째 argument에는 index가 들어갈 수 있는데 (숫자로된) 이값을 사용해 key
값을 넣어줌.✅ 결과화면
//App.js
import { useState } from "react";
function App() {
const [toDo, setToDo] = useState("");
const [toDos, setToDos] = useState([]);
const onChange = (event) => setToDo(event.target.value);
const onSubmit = (event) => {
event.preventDefault();
if (toDo === "") {
return;
}
setToDos((currentArray) => [toDo, ...currentArray]);
setToDo("");
};
console.log("toDos의 현재값", toDos);
return (
<div>
<h1>My To Dos ({toDos.length})</h1>
<form onSubmit={onSubmit}>
<input
onChange={onChange}
value={toDo}
type="text"
placeholder="Write your to do..."
/>
<button>Add To Do</button>
</form>
<hr />
<ul>
{toDos.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
</div>
);
}
export default App;
💡 이제 간단하게 암호화폐(코인)들과 그 가격을 나열하는 것을 할거임
첫번째로 할 것은, 페이지나 처음 들어왔을 때 로딩 메세지가 보이게 하는것
import { useState } from 'react';
function App() {
const [loading, setLoading] = useState(true);
return (
<div>
<h1>The Coins</h1>
{loading ? <strong>Loading...</strong> : null}
</div>
);
}
export default App;
true
임<strong>Loading...</strong>
를 화면에 출력해주고 있음import { useState, useEffect } from 'react';
function App() {
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch('https://api.coinpaprika.com/v1/tickers')
.then((response) => response.json())
.then((json) => console.log(json));
}, []); //빈배열은 처음 한번만 실행됨.
return (
<div>
<h1>The Coins</h1>
{loading ? <strong>Loading...</strong> : null}
</div>
);
}
.then((response) => response.json())
:받아온 response를 json형식을 추출해옴.200 ok
로 response를 잘 받아온것을 확인할 수 있음.이제 이 data를 우리의 component에서 어떻게 보여줄 수 있을까?
-> data를 useState()를 이용해 변경함수에 담아준다!
function App() {
const [loading, setLoading] = useState(true);
const [coins, setCoins] = useState([])
useEffect(() => {
fetch('https://api.coinpaprika.com/v1/tickers')
.then((response) => response.json())
.then((json) => {
setCoins(json); //변경함수에 data를 넣어줌
setLoading(false);
//coins 얻기를 끝냈다면 loading을 false로 바꿔줌
});
}, []);
return (
<div>
<h1>The Coins</h1>
{loading ? <strong>Loading...</strong> : null}
</div>
);
}
setCoins
에 담아줌loading
을 false로 바꿔줌💡 이제 우리는 coins라는 변수에 코인들의 array가 담겨있다는 것을 알고 있음. 어떻게 할까?
=> .map() 을 사용하자!
function App() {
const [loading, setLoading] = useState(true);
const [coins, setCoins] = useState([]);
useEffect(() => {
fetch('https://api.coinpaprika.com/v1/tickers')
.then((response) => response.json())
.then((json) => {
setCoins(json);
setLoading(false);
});
}, []);
return (
<div>
<h1>The Coins ({coins.length})</h1>
{loading ? <strong>Loading...</strong> : null}
<ul>
{coins.map((coin) => (
<li>
{coin.name} ({coin.symbol}) : ${coin.quotes.USD.price} USD
</li>
))}
</ul>
</div>
);
}
coins
안에 들은 코인 배열들을 ul태그로 화면에 출력해줌coin.원하는것
으로 원하는 속성만 골라서 출력해줄 수 있음.function App() {
const [loading, setLoading] = useState(true);
const [coins, setCoins] = useState([]);
useEffect(() => {
fetch("https://api.coinpaprika.com/v1/tickers")
.then((response) => response.json())
.then((json) => {
console.log(json);
setCoins(json);
setLoading(false);
});
}, []);
return (
<div>
<h1>The Coins {loading ? "" : `(${coins.length})`}</h1>
{loading ? (
<strong>Loading...</strong>
) : (
<select>
{coins.map((coin) => (
<option key={coin.id}>
{coin.name} ({coin.symbol}): ${coin.quotes.USD.price} USD
</option>
))}
</select>
)}
</div>
);
}
{loading ? <strong>Loading...</strong> : null}
null이였던 자리에 select
태그로 바꾼 코드로 바꿔줌loading
이 false로 바뀌면서 null이 실행 되었는데 null에 코드를 넣어줘서 이제는 코인select
박스가 보일 것임✅ 결과화면
import { useEffect, useState } from "react";
function App() {
const [loading, setLoading] = useState(true);
const [coins, setCoins] = useState([]);
useEffect(() => {
fetch("https://api.coinpaprika.com/v1/tickers")
.then((response) => response.json())
.then((json) => {
console.log(json);
setCoins(json);
setLoading(false);
});
}, []);
return (
<div>
<h1>The Coins {loading ? "" : `(${coins.length})`}</h1>
{loading ? (
<strong>Loading...</strong>
) : (
<select>
{coins.map((coin) => (
<option key={coin.id}>
{coin.name} ({coin.symbol}): ${coin.quotes.USD.price} USD
</option>
))}
</select>
)}
</div>
);
}
export default App;