Section2 Unit9 [React] ํด๋ผ์ด์ธํธ Ajax ์์ฒญ - StateAirline Client ๊ณผ์ ๋ฆฌ๋ทฐ
โญ๏ธ ๊ณผ์ . StateAirline Client
โ๏ธ Bare Minimum Requirement
โ Part 1 ํ ์คํธ ํต๊ณผ
โ Part 2 ํ ์คํธ ํต๊ณผ
โ๏ธ ๊ตฌํ ๊ณผ์ ๋ ธํธ
โจ Search.js
import { useState } from "react";
function Search({ onSearch }) {
const [textDeparture, setTextDeparture] = useState("ICN");
const [textDestination, setTextDestination] = useState("");
const handleChange = (e, callback) => {
callback(e.target.value.toUpperCase());
};
// const handleKeyDown = (e) => {
// if (e.type === "keydown" && e.code === "Enter") {
// handleSearchClick();
// }
// };
const handleSearchClick = (e) => {
e.preventDefault();
console.log("๊ฒ์ ๋ฒํผ์ ๋๋ฅด๊ฑฐ๋, ์ํฐ๋ฅผ ์น๋ฉด search ํจ์๊ฐ ์คํ๋ฉ๋๋ค");
// TODO: ์ง์์ ๋ฐ๋ผ ์์ ์ปดํฌ๋ํธ์์ props๋ฅผ ๋ฐ์์ ์คํ์์ผ ๋ณด์ธ์.
onSearch({ departure: textDeparture, destination: textDestination });
};
return (
<form onSubmit={handleSearchClick}>
<fieldset>
<legend>๊ณตํญ ์ฝ๋๋ฅผ ์
๋ ฅํ๊ณ , ๊ฒ์ํ์ธ์</legend>
<span>์ถ๋ฐ์ง</span>
<input
id="input-departure"
type="text"
value={textDeparture}
onChange={(e) => handleChange(e, setTextDeparture)}
placeholder="ICN, CJU ์ค ํ๋๋ฅผ ์
๋ ฅํ์ธ์"
// onKeyDown={handleKeyDown}
></input>
<span>๋์ฐฉ์ง</span>
<input
id="input-destination"
type="text"
value={textDestination}
onChange={(e) => handleChange(e, setTextDestination)}
placeholder="CJU, BKK, PUS ์ค ํ๋๋ฅผ ์
๋ ฅํ์ธ์"
// onKeyDown={handleKeyDown}
/>
<button type="submit"
id="search-btn"
// onClick={handleSearchClick}
disabled={ textDeparture === "ICN" || textDeparture === "CJU" ? false : true }
>๊ฒ์
</button>
</fieldset>
</form>
);
}
export default Search;
๐ฌ onSearch({ destination: textDestination });
์ด๋ ๊ฒ ์ ๋ฌํด๋ ๋๋๊ฑฐ ๋ชฐ๋ผ์ ํ์ฐธ ํค๋งธ๋ค...
๐ฌ form ํ๊ทธ์ submit ์ด๋ฒคํธ๋ฅผ ์ ์ฉ์์ผ ๊ธฐ์กด์ handleKeyDown
ํจ์๋ ์ฌ์ฉํ์ง ์๋ ๋ฐฉํฅ์ผ๋ก ๋ณ๊ฒฝ (form ํ๊ทธ ๋ด์์ Enter๋ฅผ ๋๋ ์ ๋ submit ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ๋ก ์ ์ฉํ ์ ์๋ค.)
๐ฌ ๊ธฐ์กด์ ๋์ฐฉ์ง๋ง ์ค์ ํ๋ ์ฝ๋์์, ์ถ๋ฐ์ง๋ ์ง์ ํ ์ ์๋๋ก ๋ณ๊ฒฝ
๐ฌ ์ถ๋ฐ์ง์ ์๋ฌด๊ฒ๋ ์ ๋ ฅํ์ง ์์ผ๋ฉด ๋ฒํผ์ด disabled ๋๋๋ก button ํ๊ทธ์ disabled ์์ฑ์ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ผ๋ก ์์
๐ ๋คํธ์ํฌ ์์ฒญ์ ๋๋ฆฌ๊ณ ๋น์ธ๋ค!!
1. ์ ์ฒด ํญ๊ณตํธ์ ๋ฐ์์จ ํ ์ฌ์ฉ์ ์ค์ ํ ์กฐ๊ฑด๋๋ก ์ ์ฒด ํญ๊ณต๊ถ ๋ชฉ๋ก์ ํํฐ๋ง โ
2. ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ์ ์ฒด๊ฐ ์๋ ์ฌ์ฉ์๊ฐ ์ค์ ํ ์กฐ๊ฑด์ ํด๋นํ๋ ํญ๊ณต๊ถ ๋ชฉ๋ก ๋ฐ์์์ ๊ทธ๋๋ก ๋ ๋๋ง โญ
// fetch๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
function getFlight(filterBy) {
const departure = filterBy.departure;
const destination = filterBy.destination;
const data = fetch(`testurl.com/flight?departure=${departure}&destination=${destination}`)
.then(res => res.json())
return data;
}
useEffect(() => {
setIsLoading(true);
getFlight(condition)
.then(data => setFlightList(data))
.finally(() => {
setIsLoading(false);
})
}, [condition])
๐ ์ค๋์ ํ๊ณ
States Airline ๊ณผ์ ๋ฅผ ๋ง๋ฌด๋ฆฌํ๊ณ , ํ์ํ ๊ฒ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ ์ข ๋ ๊ตฌํํด๋ณด์๋ค. ์ค์ ๋ก ํ๋ฉด์ ๋ณด๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ ๋ญ๊ฐ๋ฅผ ๋ง๋๋ ํ์คํ ์ฌ๋ฏธ๊ฐ ์๋ค๊ณ ๋๊ปด์ก๋ค. ๊ณผ์ ๋ฅผ ์ ์ถํ๊ณ , ๋ค์ ์ ๋์ธ node๋ก server ๋ง๋๋ ํํธ๋ฅผ ์กฐ๊ธ ๋ดค๋๋ฐ, ์ด๊ฑด ์ ๋ง๋ก ์ฒ์ ์ ํ๋ ๊ฐ๋ ์ด๋ผ ์ดํด๋ ์๋๊ณ ๋๋ฌด ์ด๋ ค์ ๋ณด์๋ค. ์ค๋๋ถํฐ ์์ต์ ํด์ผ์ง… ๐ซฅ
'Frontend Dev > ๐ฅ ์ฝ๋์คํ ์ด์ธ FE ๋ถํธ์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Section2 Unit10 [Web Server] ๊ธฐ์ด - Refactor Express (0) | 2023.06.02 |
---|---|
Section2 Unit10 [Web Server] ๊ธฐ์ด - CORS & Mini Node Server (0) | 2023.06.01 |
Section2 Unit9 [React] ํด๋ผ์ด์ธํธ Ajax ์์ฒญ (0) | 2023.05.30 |
Section2 Unit8 [HTTP/๋คํธ์ํฌ] ์ค์ต - Postman (0) | 2023.05.26 |
Section2 Unit8 [HTTP/๋คํธ์ํฌ] ์ค์ต - REST API (0) | 2023.05.25 |