React JS - 05

2023. 8. 26. 15:04React JS

SMALL

1. useState 를 이용하여 list 값 추가하기 & map 함수 이용

 - 기존의 변수 선언과 같이 코드를 작성하고 빈 배열로 초기화해준다.

 - [ setList ( listName => [...listName, valueName]) ] 형식으로 새로운 value 를 기존의 리스트에 추가할 수 있다.

 - map 함수를 아용하여 리스트에 있는 값들에 접근할 수 있다.

 - map 함수의 첫번째 인자는 리스트 내의 요소를 가져오고, 두번째 인자는 해당 요소의 index 를 가져온다.

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();
    // console.log(todo);
    if (todo == "") return;
    setTodo("");
    setTodos(currentArray => [...currentArray, todo]);
  }
  console.log(todos);
  return (
    <div>
      <h1>My Todos {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.map((item, index) => ( <div key={index}>{index + 1} :  {item}</div>))} 
    </div>
  );
}
// map 을 이용하여 추가한 항목 나타내기

export default App;

 

2. api 가져와서 데이터 활용하기

 - fetch 를 이용하여 데이터를 가져와 가져온 데이터를 리스트에 저장한다.

 - 리스트에 map 함수를 이용하여 데이터를 나타낼 수 있다.

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) => setCoins(json));
    setLoading(false);

  }, [])
  console.log(coins);
  return (
    <div>
      <h1>Coins! {loading ? "nothings" : `(${coins.length})`}</h1>
      {loading ? <strong>Loading...</strong> : null}
      <select>
        {coins.map((coin) => <option>
          {coin.name} ({coin.symbol}) : ${coin.quotes.USD.price} USD
          </option>)}
      </select>
    </div>
  );
}

// select, option 이용해서 달러를 btc 로 전환하는 챌린지

export default App;

3. 영화 정보 보여주기

 - async 함수를 이용해서 비동기로 api 를 가져온다.

 - 위의 비트코인 정보를 가져오는 것과 같은 과정으로 진행된다.

import { useEffect, useState } from "react";

function App() {
  const [loading, setLoading] = useState(true);
  const [movies, setMovies] = useState([]);

  useEffect(async () => {
    const json = await (
      await fetch
      (`https://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key={개인키}&targetDt=20230820`
      )
      ).json();
    setMovies(json.boxOfficeResult.dailyBoxOfficeList);
    setLoading(false);
  }, []);

  console.log(movies);
  return(
    <div>
      <h1>{loading ? "nothings" : `hot movies : ${movies[0].movieNm}`}</h1>
      {loading ? <h1>Movie loading...</h1> : 
      <div>
          {movies.map((movie) => { return <li key={movie.rank}>{movie.rank} {movie.movieNm}</li>})}
        </div>}
    </div>
  )
  
}

// 오우 일단.. map 함수는 map(함수);
// map ( () => {retrun ()}) -> 형태여야 오류가 안나는듯??
// fetch 는 백틱으로 감싸줘서 사용가능함....

export default App;

4. router 사용하기

 - router 를 이용하여 다른 페이지로 이동할 수 있다.

 - 배고파요...

 - [ <Route path="/pageName"><pageName/></Route> ] 형식으로 페이지 url을 설정한다.

 - 기본 페이지는 Home.js 로 옮겨 App.js 에서 태그로 사용한다.

 - 기본 페이지에서 리스트 형식으로 나오는 영화 이름 또한 component로 빼서 Movie.js 를 생성한다. 

 

App.js

import { useEffect, useState } from "react";
import {
  BrowserRouter as Router,
  Switch,
  Route,
} from 'react-router-dom';
import Home from "./routes/Home";
import Detail from "./routes/Detail";

function App() {
  return <Router>
    <Switch>
      <Route path="/detail" ><Detail /></Route>
      <Route path="/"><Home /></Route>
    </Switch>
  </Router>;
  
}

export default App;

Movie.js

import PropTypes from 'prop-types';
import {Link} from 'react-router-dom';

function Movie({rank, name}) {
    console.log();
    return (
    <div>
        <li><Link to="/detail">{rank} {name} </Link></li>
        <p>{name} : Movie infromation </p>
    </div>
    );
}

Movie.propType ={
    rank: PropTypes.string.isRequired,
    name: PropTypes.string.isRequired,
}
 export default Movie;

Home.js

import { useEffect, useState } from "react";
import Movie from "../components/Movie.7.4";

function Home() {
  const [loading, setLoading] = useState(true);
  const [movies, setMovies] = useState([]);

  useEffect(() => {
    async function getMovies (){
    const json = await (
      await fetch
      (`https://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key={개인키}&targetDt=20230820`
      )
      ).json();
    setMovies(json.boxOfficeResult.dailyBoxOfficeList);
    setLoading(false);
    }
    getMovies();
  }, []);

  console.log(movies);
  return(
    <div>
      <h1>{loading ? "nothings" : `hot movie: ${movies[0].movieNm}`}</h1>
      {loading ? <h1>Movie loading...</h1> : 
      <div>
          {movies.map((movie) => { return <Movie key={movie.rank}rank={movie.rank} name={movie.movieNm }/>})}
        </div>}
    </div>
  )
  
}

// url 주소에 따라서 서로 다른 페이지를 보여줌 
// router 는 url을 보는 거임
// useEffect 부분 사용 수정 -> indirect function 으로 사용


export default Home;

 

5. url 에 parameter 전달하고 가져오기

 - url 을 설정할 때 [ /:parameterName ] 형식으로 추가해서 url 에 parameter 을 넘겨주고 가져올 수 있다.

 - 예를 들어 "/:id/:name" url 은 id, name parameter 을 가져온다. 

 - 밑의 코드는 영화 리스트의 제목을 click 했을 때 해당 영화가 개봉했을 때의 가장 인기있는 영화의 제목이 나타난다. 

 App.js

import { useEffect, useState } from "react";
import {
  BrowserRouter as Router,
  Switch,
  Route,
} from 'react-router-dom';
import Home from "./routes/Home";
import Detail from "./routes/Detail";

function App() {
  return <Router>
    <Switch>
      <Route path="/detail/:id/:date" ><Detail /></Route>
      <Route path="/"><Home /></Route>
    </Switch>
  </Router>;
  
}

export default App;

Home.js

import { useEffect, useState } from "react";
import Movie from "../components/Movie.7.4";

function Home() {
  const [loading, setLoading] = useState(true);
  const [movies, setMovies] = useState([]);

  useEffect(() => {
    async function getMovies (){
    const json = await (
      await fetch
      (`https://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key={개인키}&targetDt=20230820`
      )
      ).json();
    setMovies(json.boxOfficeResult.dailyBoxOfficeList);
    setLoading(false);
    }
    getMovies();
  }, []);

  console.log(movies);
  return(
    <div>
      <h1>{loading ? "nothings" : `hot movie: ${movies[0].movieNm}`}</h1>
      {loading ? <h1>Movie loading...</h1> : 
      <div>
          {movies.map((movie) => { return <Movie key={movie.rank} date={movie.openDt}id={movie.rank} rank={movie.rank} name={movie.movieNm }/>})}
        </div>}
    </div>
  )
  
}

// url 주소에 따라서 서로 다른 페이지를 보여줌 
// router 는 url을 보는 거임
// useEffect 부분 사용 수정 -> indirect function 으로 사용


export default Home;

Detail.js

import { useEffect } from "react";
import { useParams } from "react-router-dom/cjs/react-router-dom.min";
function Detail() {
    var { id, date } = useParams();
    console.log(id, date);
    var reform = date.split("-");
    date = reform[0] + reform[1] + reform[2]


    useEffect(()=> {
        async function getFetch() {
            const json = await( await fetch(
                `https://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key={개인키}&targetDt=${date}`
            )).json();
            console.log(json);
        }
        getFetch();
    }, [])
    return <h1>Detail router</h1>
}

export default Detail;

Movie.js

import PropTypes from 'prop-types';
import {Link} from 'react-router-dom';

function Movie({id,rank, name, date}) {
    console.log();
    return (
    <div>
        <li><Link to={`/detail/${id}/${date}`}>{rank} {name} </Link></li>
        <p>{name} : Movie infromation </p>
    </div>
    );
}

Movie.propType ={
    rank: PropTypes.string.isRequired,
    name: PropTypes.string.isRequired,
}
 export default Movie;

 

이상으로 react JS 에 대한 공부글은 마무리하겠습니당

이후엔 react app에 대한 프로젝트 글로 돌아올게요~

완강한거 뿌듯합니당 ㅎㅎ

반응형
LIST

'React JS' 카테고리의 다른 글

React - Swiper 사용하기, 카드 및 화면 슬라이드 시 사용  (0) 2024.01.26
React - css 속성 | background 에 이미지 넣기  (0) 2024.01.06
React JS - 04  (0) 2023.08.22
React JS - 03  (0) 2023.08.18
React JS - 02  (0) 2023.08.15