카테고리 없음

리엑트 강의 내용 정리2

jkkll 2022. 7. 1. 23:20

useEffect

코드가 한번만 실행될 수 있도록 한다

import React, { useEffect } from "react";
import { useState } from "react";

function App() {
  const [counter, setValue] = useState(0);
  const [keyword, setKeyword] = useState("");
  const onClick = () => setValue((prev) => prev + 1);
  const onChange = (event) => setKeyword(event.target.value);
  //[]안의 값이 업데이트 될 때 실행된다
  useEffect(() => {
    console.log("I run only once");
  }, []);
  useEffect(() => {
    console.log("I run when 'keyword' changes.");
  }, [keyword]);
  useEffect(() => {
    console.log("I run when 'counet' changes");
  }, [counter]);
  useEffect(() => {
    console.log("I run when 'keword' & 'counter' changes");
  }, [keyword, counter]);
  useEffect(() => {
    if (keyword !== "" && keyword.length > 5) {
      console.log("SEARCH FOR", keyword);
    }
  }, [keyword]);
  return (
    <div>
      <input
        value={keyword}
        onChange={onChange}
        type="text"
        placeholder="Search here..."
      />
      <h1>{counter}</h1>
      <button onClick={onClick}>click me</button>
    </div>
  );
}

export default App;

cleanup

function Hello() {
  useEffect(function () {
    console.log("hi :)");
    return function () {
      console.log("bye");
    };
  }, []);
  useEffect(() => {
    console.log("hi :)");
    return () => console.log("bye :(");
  }, []);
  return <h1>Hello</h1>;
}
function App() {
  const [showing, setShowing] = useState(false);
  const onClick = () => setShowing((prev) => !prev);
  return (
    <div>
      {/*showing이 true경우 Hello컴포넌트 보여주고 false일 경우 null */}
      {showing ? <Hello /> : null}
      <button onClick={onClick}>{showing ? "Hide" : "Show"}</button>
    </div>
  );
}
export default App;

ToDo list

import React, { 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;
    }
    //currentArray의 element를 가져와서 새로운 array를 만들기 위해 ...작성
    //작성했던 todo와 새로 작성한 todo를 합쳐서 array를 생성해준다
    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 />
      //toDos array를 가져와 각 todo를 의미하는 이름 설정(item)해주고 key값을 입력하기 위해 index를 추가한다
      <ul>
        {toDos.map((item, index) => (
          <li key={index}>{item}</li>
        ))}
      </ul>
    </div>
  );
}
export default App;

Coin Tracker

import React, { useEffect, useState } from "react";

function App() {
  const [loading, setLoading] = useState(true);
  const [coins, setCoins] = useState([]);
  useEffect(() => {
    //then response를 받아서 reponse.json을 return해준다
    fetch("https://api.coinpaprika.com/v1/tickers")
      .then((response) => response.json())
      .then((json) => {
        // .then((json) => console.log(json));
        // useState추가 후 setCoins json설정
        setCoins(json);
        //setLodaing을 false로 변경해서 loading텍스트가 안 보이게 한다
        setLoading(false);
      });
  }, []);
  return (
    <div>
      <h1>The Coins! {loading ? "" : `(${coins.length})`}</h1>
      {/*로딩이 아닐 경우 표시해준다 */}
      {loading ? (
        <strong>Loading...</strong>
      ) : (
        <select>
          {coins.map((coin, id) => (
            <option key={id}>
              {coin.name} ({coin.symbol}): ${coin.quotes.USD.price} USD
            </option>
          ))}
        </select>
      )}
    </div>
  );
}

Movie App

import React, { useEffect, useState } from "react";

function App() {
  const [loading, setLoading] = useState(true);
  //기본값을 빈 배열로 설정해준다
  const [movies, setMovies] = useState([]);
  //async-await사용법 좀 더 보편적으로 사용됨
  //getMovies라는 함수생성 async함수가 됨
  //useEffect를 이용해 getMovies호출
  //then을 사용하는 대신에 const response...
  //json 가져와서 await response.json
  //이게 더 보기 좋다고함,
  //밑 버전의 짧은 버전 useEffect부분은 같음
  const getMovies = async () => {
    const json = await (
      await fetch(
        `https://yts.mx/api/v2/list_movies.json?minimum_rating=8.8&sort_by=year`
      )
    ).json();
    setMovies(json.data.movies);
    setLoading(false);
  };
  useEffect(() => {
    getMovies();
  }, []);

  // const getMovies = async () => {
  //   const response = await fetch(
  //     `https://yts.mx/api/v2/list_movies.json?minimum_rating=8.5&sort_by=year`
  //   );
  //   const json = await response.json();
  //   setMovies(json.data.movies);
  //   setLoading(false);
  // };
  // useEffect(() => {
  //   getMovies();
  // }, []);
  //일반적 fetch사용
  // useEffect(() => {
  //   //평점이 8.5이상인 영화 url
  //   fetch(
  //     `https://yts.mx/api/v2/list_movies.json?minimum_rating=8.5&sort_by=year`
  //   )
  //     //response를 받아와서 response.json을 return해주고 json을 가져와서 콘솔로 출력
  //     .then((response) => response.json())
  //     // .then((json) => console.log(json));
  //     //console확인후 data있는 부분
  //     .then((json) => {
  //       setMovies(json.data.movies);
  //       //로딩을 끝냈기 때문에 false로 바꿔준다
  //       setLoading(false);
  //     });
  // }, []);
  //movies를 console출력해보면 data를 받아온것을 확인할 수 있다
  // console.log(movies);
  return (
    <div>
      {loading ? (
        <h1>Loading...</h1>
      ) : (
        <div>
          {movies.map((movie) => (
            <div key={movie.id}>
              <img src={movie.medium_cover_image} />
              <h2>{movie.title}</h2>
              <p>{movie.summary}</p>
              {/*array를 가져올 경우 map을 써준다 g는 사용자설정이름이다 각 genres를 뜻한다 첫번재 argument
              key값에 g는 고유값이기 때문에 써줄 수 있다
              */}
              <ul>
                {movie.genres.map((g) => (
                  <li key={g}>{g}</li>
                ))}
              </ul>
            </div>
          ))}
        </div>
      )}
    </div>
  );
}

export default App;

react-router-dom

npm install react-router-dom 설치

페이지 이동

import React, { useEffect, useState } from "react";
import Movie from "./components/Movie";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Home from "./routes/Home";
import Detail from "./routes/Detail";

function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/movie" element={<Detail />} />
        <Route path="/" element={<Home />} />
      </Routes>
    </BrowserRouter>
  );
}

export default App;

깃헙 페이지

설치

npm i gh-pages

build-코드를 압축하고 최적화 npm build로 실행시킬 수 있다

npm build로 실행시킨 후 build폴더가 생성되면 그걸 github pages에 push한다

push하기 전 package.json에서 

마지막 부분에 homepage" :https:유저이름.github.io/폴더이름 적어준다

scripts부분

추가로 작성해준다 predeploy는 deply실행 전에 먼저 실행된다 npm run deploy하면 predeply가 먼저 실행되어

npm run build를 실행하게 된다 그리고 react-script 실행 후 다 끝나면 deploy가 실행된다

deploy는 homepage부분에 적어놓은 웹사이트에 업로드한다