๐Ÿ“–[React] useEffect, fetch()๋กœ ํ˜ธ์ถœ

ํ˜ฑยท2022๋…„ 10์›” 15์ผ

React

๋ชฉ๋ก ๋ณด๊ธฐ
23/28

useEffect()

์ƒํƒœ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑ
์ƒํƒœ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์„œ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜์—ˆ์„ ๋•Œ ํ˜ธ์ถœ
๊ทธ๋Ÿฌ๋‚˜ ์›ํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ๋„ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์Œ-> ๋ถˆํ•„์š”ํ•œ ์‹คํ–‰
๋”ฐ๋ผ์„œ ๋‘๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ [๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ’] ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋จ.
useEffect(ํ•จ์ˆ˜, [๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ’]);
์ตœ์ดˆ์˜ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ -> useEffect(ํ•จ์ˆ˜, [])
๋นˆ๋ฐฐ์—ด! -> ๋ Œ๋”๋ง ์งํ›„ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ

Api ํ˜ธ์ถœ

 const [days, setDays] = useState([]);

 useEffect(() => {
    fetch("http://localhost:3001/days").then((res) => {
      return res.json();
    })
   .then((data) => {
        setDays(data);
      });
  }, []);
  1. API ๋น„๋™๊ธฐ ํ†ต์‹  = fetch('api๊ฒฝ๋กœ')์ด์šฉ
  2. .then์„ ์ด์šฉํ•ด์„œ res(response).json์„ ํ†ตํ•ด returnํ•ด์คŒ
  3. ์ด ๋•Œ, response๋Š” http ์‘๋‹ต์ด๊ณ  ์‹ค์ œ json์€ ์•„๋‹˜
  4. .then์„ ํ†ตํ•ด data๋ฅผ ๋ฐ›์•„์„œ setDays๋ฅผ data๋กœ ํ•ด์คŒ
  5. useEffect()์— ๋นˆ๋ฐฐ์—ด์„ ๋„ฃ์–ด ์ฃผ์–ด์•ผ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋จ..! ์•ˆ ๊ทธ๋Ÿฌ๋ฉด terminal ๋‚œ๋ฆฌ..

dummy๋กœ ์‚ฌ์šฉํ–ˆ๋˜ ๋ถ€๋ถ„์„ ๊ต์ฒดํ•ด์ฃผ๊ธฐ

Day.js

import dummy from "../db/data.json";
import Word from "./Word";
import { useParams } from "react-router-dom";
import { useEffect, useState } from "react";

export default function Day() {
  const { day } = useParams();
  // const wordList = dummy.words.filter((word) => word.day === Number(day));
  const [words, setWords] = useState([]);

  useEffect(() => {
    fetch(`http://localhost:3001/words?day=&{day}`)
      .then((res) => {
        return res.json();
      })
      .then((data) => {
        setWords(data);
      });
  }, [day]);

  return (
    <>
      <h2>Day {day}</h2>
      <table>
        <tbody>
          {words.map((word) => (
            <Word word={word} key={word.id} />
          ))}
        </tbody>
      </table>
    </>
  );
}

์ด ๋•Œ useEffect๋ถ€๋ถ„์—์„œ,http://localhost:3001/words?day=&{day}
const {day} = useParam()์„ ์ด์šฉํ•ด์„œ ์ฃผ์†Œ์ฐฝ์— ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ๋“ค์–ด์˜ค๋Š” ๊ฒƒ
์ด ๋•Œ useEffect๋‚ด๋ถ€์—์„œ day์™€ ๊ฐ™์ด ํŠน์ •๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜์กด์„ฑ ๋ฐฐ์—ด์— ์ž…๋ ฅํ•ด์•ผ ํ•จ. ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋ฐฐ์—ด์ด๋ฉด day๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Œ!
(ํ•œ๋ฒˆ๋งŒ ๋ Œ๋”๋ง๋˜๊ธฐ ๋•Œ๋ฌธ)
๋”ฐ๋ผ์„œ [day]๋กœ ๋„ฃ์–ด์ฃผ๊ธฐ!

์‚ฌ์šฉ ์˜ˆ์‹œ ๋น„๊ต

DayList.js

 const [days, setDays] = useState([]);

 useEffect(() => {
    fetch("http://localhost:3001/days").then((res) => {
      return res.json();
    })
   .then((data) => {
        setDays(data);
      });
  }, []);

Day.js

 const [words, setWords] = useState([]);

  useEffect(() => {
    fetch(`http://localhost:3001/words?day=&{day}`)
      .then((res) => {
        return res.json();
      })
      .then((data) => {
        setDays(data);
      });
  }, [day]);
  1. state๋ฅผ ๋งŒ๋“ค๊ธฐ
  2. fetch๋กœ list๋ฅผ ๊ฐ€์ ธ์˜ด
  3. set์„ ํ•ด์ค€๋‹ค!
    ์ด๋Š” ๋™์ผํ•œ logic์ด๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ hook์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ!
profile
new blog: https://hae0-02ni.tistory.com/

0๊ฐœ์˜ ๋Œ“๊ธ€