ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 4.3 part1
    코드스테이츠 2023. 4. 4. 02:22

    < Main.js >
    메인 (부모컴포넌트)에 있는 search함수가 search 컴포넌트 (자식컴포넌트)의 검색 버튼 클릭시 실행되어야 한다 

    상태끌어올리기를 사용

    import Head from "next/head";
    import {useEffect, useState} from "react";
    import {getFlight} from "../api/FlightDataApi";
    import FlightList from "./component/FlightList";
    import LoadingIndicator from "./component/LoadingIndicator";
    import Search from "./component/Search";
    import Debug from "./component/Debug";
    import json from "../resource/flightList";
    
    export default function Main() {
      // 항공편 검색 조건을 담고 있는 상태
      const [condition, setCondition] = useState({
        departure: "ICN",
      });
      const [flightList, setFlightList] = useState(json);
    
      // 주어진 검색 키워드에 따라 condition 상태를 변경시켜주는 함수
    	// search 함수가 전달 받아온 '항공편 검색 조건' 인자를 condition 상태에 담기
      const search = ({departure, destination}) => {
        if (condition.departure !== departure || condition.destination !== destination) {
          setCondition({departure, destination});
    	  }};
    
      const filterByCondition = (flight) => {
        let pass = true;
        if (condition.departure) {
          pass = pass && flight.departure === condition.departure;
        }
        if (condition.destination) {
          pass = pass && flight.destination === condition.destination;
        }
        return pass;
      };
    
      global.search = search; // 테스트를 위해 필요한 코드
    
      // search 함수를 Search 컴포넌트로 내려주기
      return (
        <div>
          <Head>
            <title>States Airline</title>
            <link rel="icon" href="/favicon.ico" />
          </Head>
    
          <main>
            <h1>여행가고 싶을 땐, States Airline</h1>
            <Search onSearch={search} />
            <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>
              <FlightList list={flightList.filter(filterByCondition)} />
            </div>
    
            <div className="debug-area">
              <Debug condition={condition} />
            </div>
            <img id="logo" alt="logo" src="codestates-logo.png" />
          </main>
        </div>
      );
    }

    < Search.js >

    import {useState} from "react";
    
    function Search({onSearch}) {
      const [textDestination, setTextDestination] = useState("");
    
      const handleChange = (e) => {
        setTextDestination(e.target.value.toUpperCase());
      };
    
      const handleKeyPress = (e) => {
        if (e.type === "keypress" && e.code === "Enter") {
          handleSearchClick();
        }
      };
    
    	// 상위 컴포넌트에서 props를 받아서 실행
      const handleSearchClick = () => {
        onSearch({departure: "ICN", destination: textDestination});
      };
    
      return (
        <fieldset>
          <legend>공항 코드를 입력하고, 검색하세요</legend>
          <span>출발지</span>
          <input id="input-departure" type="text" disabled value="ICN"></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;

    '코드스테이츠' 카테고리의 다른 글

    4.12 재귀 템플릿 작성중  (0) 2023.04.12
    재귀  (1) 2023.04.11
    3.11 개인복습  (0) 2023.03.11
    3.3 JavaScript 클로저  (0) 2023.03.03
    3.2 JavaScript 스코프  (0) 2023.03.02
Designed by Tistory.