2022.06.15(Wed)
[TIL] Day35
[SEB FE] Day35
// Main.js
export default function Main() {
// ํญ๊ณตํธ ๊ฒ์ ์กฐ๊ฑด์ ๋ด๊ณ ์๋ ์ํ
const [condition, setCondition] = useState({});
// ํญ๊ณตํธ ๋ชฉ๋ก ์ํ
const [flightList, setFlightList] = useState([]);
//
const [isLoading, setIsLoading] = useState(true);
// ์ฃผ์ด์ง ๊ฒ์ ํค์๋์ ๋ฐ๋ผ condition ์ํ๋ฅผ ๋ณ๊ฒฝ์์ผ์ฃผ๋ ํจ์
const search = ({ departure, destination }) => {
if (
condition.departure !== departure ||
condition.destination !== destination
) {
setCondition({ departure: departure, destination: destination });
// key&value๊ฐ ๊ฐ์ผ๋ฏ๋ก setCondition({departure, destination}) ๋ผ๊ณ ์จ๋ ๊ฐ์
}
};
// condition ์ํ๊ฐ ๋ฌ๋ผ์ง ๋ ๋ง๋ค AJAX ์์ฒญ
useEffect(() => {
// ๋ก๋ฉ ํ๋ฉด O
setIsLoading(true);
// ์๋ต ์ฑ๊ณต์ ์๋ต์ ๋ํ ํญ๊ณตํธ ๋ชฉ๋ก์ ๋ณ๊ฒฝํ๊ณ ๋ก๋ฉํ๋ฉด X
getFlight(condition).then((response) => {
setFlightList(response),
setIsLoading(false);
});
}, [condition]);
return (
<div className="container">
<main>
<Search
onSearch={search}
condition={condition}
setCondition={setCondition}
/>
<div className="table">
<div className="row-header">
<div className="col">์ถ๋ฐ</div>
<div className="col">๋์ฐฉ</div>
<div className="col">์ถ๋ฐ ์๊ฐ</div>
<div className="col">๋์ฐฉ ์๊ฐ</div>
<div className="col"></div>
</div>
{/* ๋ก๋ฉ์ค์ด๋ฉด ๋ก๋ฉ ํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์๋๋ฉด ํญ๊ณตํธ ๋ชฉ๋ก์ ๋ณด์ฌ์ค */}
{isLoading ? <LoadingIndicator /> : <FlightList list={flightList} />}
{/* FlightList ์ปดํฌ๋ํธ๋ฅผ ๋ณด๋ฉด list๋ฅผ props๋ก ๋ฐ์์์ผ๋ฏ๋ก ์ฌ๊ธฐ์ list={flightList}๋ก FlightList์ ์ ๋ฌํด์ฃผ๋ ๊ฒ */}
</div>
</main>
</div>
);
}
// Search.js
function Search({ onSearch, condition, setCondition }) {
// ์ถ๋ฐ์ง ์ํ
const [textDeparture, setTextDeparture] = useState("");
// ๋์ฐฉ์ง ์ํ
const [textDestination, setTextDestination] = useState("");
// ๋์ฐฉ์ง event handler
const handleChange = (e) => {
setTextDestination(e.target.value.toUpperCase());
};
// ์ถ๋ฐ์ง event handler
const handleChange2 = (e) => {
setTextDeparture(e.target.value.toUpperCase());
};
const handleKeyPress = (e) => {
if (e.type === "keypress" && e.code === "Enter") {
handleSearchClick();
}
};
const handleSearchClick = () => {
onSearch({ departure: textDeparture, destination: textDestination });
};
return (
<fieldset className="search-css">
<legend>๊ณตํญ ์ฝ๋๋ฅผ ์
๋ ฅํ๊ณ , ๊ฒ์ํ์ธ์</legend>
<span>์ถ๋ฐ์ง</span>
<input
id="input-departure"
type="text"
value={textDeparture}
onChange={handleChange2}
onKeyPress={handleKeyPress}
placeholder="ICN, CJU ์ค ํ๋๋ฅผ ์
๋ ฅํ์ธ์"
></input>
<span>๋์ฐฉ์ง</span>
<input
id="input-destination"
type="text"
value={textDestination}
onChange={handleChange}
placeholder="CJU, BKK, PUS ์ค ํ๋๋ฅผ ์
๋ ฅํ์ธ์"
onKeyPress={handleKeyPress}
/>
<button id="search-btn" onClick={handleSearchClick}>
๊ฒ์
</button>
</fieldset>
);
}
export default Search;
// FlightList.js
function FlightList({ list = [] }) {
if (list.length === 0) {
return <div className="merge-col">๋ชฉ๋ก์ด ์์ต๋๋ค</div>;
}
return list.map(
({ uuid, departure, destination, departure_times, arrival_times }) => {
return (
<Flight
key={uuid}
departure={departure}
destination={destination}
departureTimes={departure_times}
arrivalTimes={arrival_times}
/>
);
}
);
}
export default FlightList;
// FlightDataApi.js
import fetch from "node-fetch";
if (typeof window !== "undefined") {
localStorage.setItem("flight", JSON.stringify(flightList));
}
export function getFlight(filterBy = {}) {
console.log(filterBy);
// ์ถ๋ฐ์ง ์ ํ์ ์ํ๊ณ ์ฝ์์ ์ฐ์ผ๋ฉด filterBy์ {departure: "ICN"}์ด ์ฐํ
// ์ถ๋ฐ์ง๋ฅผ ์ ํํ๊ณ ์ฝ์์ ์ฐ์ผ๋ฉด {departure: "ICN", destination: "~"}๊ฐ ์ฐํ
// REST API ํธ์ถ
// ๋ชจ๋ ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ด
const url = `http://ec2-13-124-90-231.ap-northeast-2.compute.amazonaws.com:81/flight`;
// ๊ฐ์ฒด์ key
if (filterBy.destination === undefined) {
return fetch(url).then((res) => res.json());
}
return fetch(
`${url}?departure=${filterBy.departure}&destination=${filterBy.destination}`
).then((res) => res.json());
}
โฐย Element: React ์ฑ์ ๊ฐ์ฅ ์์ ๋จ์
โฐย Component: ์ฌ๋ฌ ์๋ฆฌ๋จผํธ์ ํจ์๋ค์ด ๋ชจ์ฌ ์๋ ๊ธฐ๋ฅ์ ๋จ์ (ํ๋์ element)
โ ย ํ๋ก๊ทธ๋๋จธ์ค Lv.1 Programmers 3๋ฌธ์ ํ์ด(๋ ์ ์ ์ฌ์ด์ ํฉ, ๋ฌธ์์ด์ ์ ์๋ก ๋ฐ๊พธ๊ธฐ, ์์ธ์์ ๊น์๋ฐฉ ์ฐพ๊ธฐ)
โ ย Youtube ๋ณ์ฝ๋ฉ - useEffect ๊ฐ์ ๋ฃ๊ณ , ์ฝ๋ ์ฐ์ต
โ ย ํ์ ํฌ๊ธฐ๋ก ์๋ผ ๋จน๋ ๋ฆฌ์กํธ(React.js) - JS ๊ธฐ๋ณธ ๊ฐ์ ๋ฃ๊ธฐ
Ajax ์์ฒญํ๋ ๋ถ๋ถ fetch ์ฌ์ฉํ๋ ์ชฝ๋ ์ด๋ ค์ ๊ณ , ์ปดํฌ๋ํธ ๋ถ๋ฆฌ๊ฐ ๋์ด์์ด์ ์ฌ๊ธฐ์ ๊ธฐ ์ด๋์ ์ด๋ค ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ ์ง ์ด๋ ค์ ๋.. ์ฒ์๋ถํฐ ํ๋ก์ ํธ๋ฅผ ์์ํด๋ณด๋ฉด์ ํ์ผ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค ์์ผ๋ก ์ฃผ๊ณ ๋ฐ๋์ง ์ฐ์ต์ด ๋ง์ด ํ์ํ ๋ฏ ํ๋ค.. fetch ์ฌ์ฉ ๋ถ๋ถ๋ ๋ณต์ต๋ณต์ต ๐ซ