개념적으로 React 컴포넌트는 항상 함수에 가깝습니다.
Hook을 사용한 함수형 컴포넌트는 클래스형 컴포넌트보다 이러한 React의 개념에 적합합니다.
Hook의 사용은 복잡한 문제에 직면했을때 명령형 코드로 보다 쉽게 해결책을 찾을 수 있게 해주며 복잡한 함수형 또는 반응형 프로그래밍 기술을 배우도록 요구하지 않습니다.
import { useState } from "react";
import { useState } from "react"; const App = () => { const [count, setCount] = useState(0); return (); }; export default App;
import { useState } from "react"; const App = () => { const [count, setCount] = useState(0); return <p>개수 : {count}</p>; }; export default App;
import { useState } from "react"; const App = () => { const [count, setCount] = useState(0); return ( <p> <div> <button onClick={() => setCount(count + 1)}>증가</button> </div> 개수 : {count} </p> ); }; export default App;
import { useEffect } from "react";
import { useEffect } from "react"; const App = () => { useEffect(() => { // 렌더링 이후 수행되어야할 코드를 작성합니다. }); return <div />; }; export default App;
import { useEffect } from "react"; import axios from "axios"; import "./App.css"; const App = () => { useEffect(() => { // 렌더링 이후 수행되어야할 코드를 작성합니다. axios .get( `https://www.googleapis.com/youtube/v3/videos ?chart=mostPopular&key=YOUR_API_KEY &part=snippet,contentDetails,statistics,status ®ionCode=KR` ) .then((response) => { console.log("한국에서 인기있는 유튜브 영상 목록", response.data.items); }); }); return <div />; }; export default App;
import { useEffect, useState } from "react"; import axios from "axios"; import "./App.css"; const App = () => { const [videoList, setVideoList] = useState([]); useEffect(() => { // 렌더링 이후 수행되어야할 코드를 작성합니다. axios .get( `https://www.googleapis.com/youtube/v3/videos ?chart=mostPopular&key=YOUR_API_KEY &part=snippet,contentDetails,statistics,status ®ionCode=KR` ) .then((response) => { console.log(response.data.items); setVideoList(response.data.items); }); }); return ( <div className="container"> {videoList.map((item, index) => ( <div className="videoItem" key={index}> <img className="thumbnail" src={item.snippet.thumbnails.maxres.url} alt="" /> {item.snippet.title} </div> ))} </div> ); }; export default App;
useEffect(() => { // 두번째 인자에 빈배열 []을 추가하여 오직 컴포넌트가 처음 마운트되는 순간에만 실행 axios .get( `https://www.googleapis.com/youtube/v3/videos ?chart=mostPopular&key=YOUR_API_KEY &part=snippet,contentDetails,statistics,status ®ionCode=KR` ) .then((response) => { console.log(response.data.items); setVideoList(response.data.items); }); }, []);
const App = () => { const [videoList, setVideoList] = useState([]); const [regionCode, setRegionCode] = useState("KR"); useEffect(() => { // 렌더링 이후 수행되어야할 코드를 작성합니다. axios .get( `https://www.googleapis.com/youtube/v3/videos?chart=mostPopular&key=AIzaSyBZfFVPoRFRmy7Xrt0DykLeng2VKr1mMh0 &part=snippet,contentDetails,statistics,status ®ionCode=${regionCode}` ) .then((response) => { console.log(response.data.items); setVideoList(response.data.items); }); }, [regionCode]); const selectRegion = (e) => { setRegionCode(e.target.value); }; return ( <div className="container"> <select onChange={selectRegion}> <option value="KR">한국</option> <option value="US">미국</option> <option value="JP">일본</option> <option value="BR">브라질</option> <option value="PH">필리핀</option> </select> <div className="listContainer"> {videoList.map((item, index) => ( <div className="videoItem" key={index}> <img className="thumbnail" src={item.snippet.thumbnails.high.url} alt="" /> {item.snippet.title} </div> ))} </div> </div> ); }; export default App;