๐Ÿš€React ์ฑŒ๋ฆฐ์ง€ Day5

westZeroยท2023๋…„ 6์›” 8์ผ
1

JS & ๋ฆฌ์•กํŠธ ์ฑŒ๋ฆฐ์ง€

๋ชฉ๋ก ๋ณด๊ธฐ
5/10

๊ณต๋ถ€๋ฅผ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ ์‹œ๊ฐ„์€ ํ—›๋œ ์‹œ๊ฐ„์ด ์—†๋‹ค!

์˜ค๋Š˜์€ useEffect hook์˜ ๋‘๋ฒˆ์งธ ์ธ์ž์ธ dependency์— ๋Œ€ํ•ด์„œ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.!
์ผ๋‹จ ์†”์งํžˆ ์•ž๋ถ€๋ถ„์„ ํ•˜๋‚˜๋„ ์•ˆ๋“ค์–ด์„œ ๋„๋Œ€์ฒด dependency๊ฐ€ ๋ญ”์ง€ ํ†ต ๋ชจ๋ฅด๊ฒ ๋”๋ผ๊ณ ์š”.
์ผ๋‹จ ๋‹ค๋ฅธ ๋ถ„๋“ค ํ‰๊ฐ€์™€ ์–ด์ฉŒ๊ณ ๋ฅผ ํ†ตํ•ด์„œ ์ดํ•ดํ•œ ๋ฐ”๋Š” ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

(์‚ฌ์‹ค ์ฒ˜์Œ TIL๋ณด๋ฉด ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณต๋˜๋„ ๊ดœ์ฐฎ์€ ์• ๋“ค์ด๋ผ๊ณ  ์ ์–ด๋†จ๋˜๊ฑฐ๊ฐ™์€๋ฐ..๊ทธ๊ฒŒ ํ‹€๋ ธ์Œ๋‹ค)

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ rendering ๋˜์—ˆ์„ ๋•Œ๋ฅผ ํฌํ•จํ•ด์„œ ์–ด๋Š ํŠน์ • state์— ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์‹คํ–‰ํ•  ์ฝ”๋“œ๋Š” useEffect hook์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค~~
์—ฌ๊ธฐ์„œ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๋Š” useEffect์˜ dependency๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  array๋Š” useEffect์˜ 2๋ฒˆ์งธ argument๋กœ ์ „๋‹ฌํ•œ๋‹ค.

์ด๋•Œ, dependency ๋ฐฐ์—ด์ด ๋นˆ ๋ฐฐ์—ด์ผ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ์•„๋ฌด ๋ณ€ํ™”๋„ ๊ฐ์ง€ํ•˜์ง€ ์•Š์œผ๋ฉด, useEffect๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜์–ด๋„ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ชจ๋“  ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ dependency ๋ฐฐ์—ด์— ์ž…๋ ฅํ•˜๋ฉด, ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ณ€ํ™”๊ฐ€ ์žˆ์œผ๋ฉด ๋ฆฌ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ญ์ƒ ๋ชจ๋“  ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅํ•œ๋‹ค๋ฉด, ์˜คํžˆ๋ ค ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋“ค๋งŒ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

import Button from "./Button";
import styles from "./App.module.css";
import { useState, useEffect } from "react";

function App() {
  // ํ•จ์ˆ˜์ปดํฌ๋„ŒํŠธ
  //state
  const [counter, setValue] = useState(0);
  const [keyword, setKEyword] = useState("");
  // keyword๋Š” setKeyword๋ผ๋Š” function์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.
  const onClick = () => setValue((prev) => prev + 1);
  const onChange = (event) => setKEyword(event.target.value);
  //setKeyword๋Š” onChange๋ผ๋Š” function์— ์˜ํ•ด ํ˜ธ์ถœ๋œ๋‹ค
  //console.log("I run all the time");
  // const iRunOnlyOnce = () => {
  //   console.log("I Run Only Once");
  // };

  useEffect(() => {
    console.log("I run only once");
  }, []); // ์ด ๋นˆ ์–ด๋ ˆ์ด์— ๋‹ด์€ ๊ฑด ์ฒ˜์Œ ๋ Œ๋”์‹œ์—๋งŒ ๋”ฑ ํ•œ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ๋ง๋ผ๋Š” ๋œป
  useEffect(() => {
    console.log("I run 'keyword' changes");
  }, [keyword]);
  useEffect(() => {
    console.log("I run 'counter' changes");
  }, [counter]);
  useEffect(() => {
    console.log("I run keyword and counter changes");
  }, [keyword, counter]);
  //useEffect(() => {
  // if (keyword !== "" && keyword.length > 6) {
  //    console.log("search for", keyword);
  //  }
  //}, [keyword]);
  return (
    <div>
      <input
        value={keyword}
        onChange={onChange}
//onChange๋Š” ์‚ฌ์šฉ์ž๊ฐ€ input์„ ๋ณ€ํ™”ํ™œ ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค
        type="text"
        placeholder="search"
      ></input>
      <h1 className={styles.title}>{counter}</h1>
      {/* <Button text={"continue"} />
      <Button text={"hola"} /> */}
      <button onClick={onClick}>click me</button>
    </div>
  );
}

export default App;

์•„๋ฌดํŠผ ๊ฒฐ๋ก ์ ์œผ๋กœ useEffect์˜ ๋‘๋ฒˆ์งธ argument๋Š” ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์•„์ด์ด๊ณ  ํ• ๋‹น๋œ ๊ฐ’์— ๋”ฐ๋ผ์„œ ๊ฐ’์— ๋ณ€ํ™”๊ฐ€ ์žˆ์œผ๋ฉด ๋ Œ๋”๋ง์„ ํ•˜๊ฒŒ๋˜์–ด์„œ ๋ถˆํ•„์š”ํ•œ ๋งŽ์€ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค๋Š” ๋ง์ž…๋‹ˆ๋‹ค.

useEffect(callback,[dep])์€ callback ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ง€์ •๋œ ํ•จ์ˆ˜๋ฅผ dep ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ง€์ •๋œ state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์‹คํ–‰ํ•ด์ค€๋‹ค. depํŒŒ๋ผ๋ฏธํ„ฐ์— ์•„๋ฌด๊ฒƒ๋„ ์—†์„ ๋•Œ๋Š” ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•  state๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋œ๋‹ค.

web์„ฑ๋Šฅ๊ฐœ์„ ์—์„œ ํฌ๊ฒŒ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์„๊บผ๊ฐ™์•„์š”!

๊ทธ๋ฆฌ๊ณ  ์ด์ œ recap๋ถ€๋ถ„! ๐Ÿ’Ž

react.js์˜ ์ œ์ผ ๋ฉ‹์ง„์ ์€ component๋ฅผ ์ƒˆ๋กœ๊ณ ์นจ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฑฐ.
์œ„์— ์˜ˆ์‹œ์ฒ˜๋Ÿผ input์ฐฝ์— ์ƒˆ๋กœ์šด ์ •๋ณด (์ฆ‰ UI)์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์ƒˆ๋กœ๊ณ ์นจ ํ•œ๋‹ค๋Š”๊ฑฐ์ฃ !

๊ทผ๋ฐ react.js๋Š” ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚  ๋•Œ๋งŒ ์ƒˆ๋กœ๊ณ ์นจํ•œ๋‹ค๋Š”๊ฑฐ์ž„
๊ทผ๋ฐ ๊ทธ ๋ณ€ํ™”๋ฅผ ๋งค๋ฒˆ ์ƒˆ๋กœ๊ณ ์นจ ํ•˜๊ธฐ ์‹ซ์„ ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— useEffect๋ฅผ ์“ด๋‹ค๋Š”๊ฑฐ์ž„

๊ทธ๋ž˜์„œ ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ : ์ตœ์†Œ ๋‹จ์œ„์˜ ๋ Œ๋”๋ง์„ ์œ„ํ•ด์„œ!
useState(): ๋ณ€์ˆ˜, ๋ณ€์ˆ˜๋ฅผ ์ œ์–ดํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ๋ณ€ํ•˜๋Š” ๊ฐ’์„ ์ œ์–ด, ํ•ด๋‹น ๋ถ€๋ถ„์˜ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ„ํ•จ
props: ํƒœ๊ทธ์˜ ์†์„ฑ ๊ฐ’์„ ํ•จ์ˆ˜์˜ ์•„๊ทœ๋จผํŠธ ์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ์— ๊ฐ’์„ ์ „๋‹ฌํ•ด์ค€๋‹ค.
useEffect(): ์ฝ”๋“œ์˜ ์‹คํ–‰ ์‹œ์ ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์„ ํƒ๊ถŒ์„ ์–ป๋Š” ๋ฐฉ์–ด๋ง‰ ๊ฐ™์€ ์กด์žฌ, ๋””ํŽœ๋˜์‹œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์ตœ์ดˆ 1ํšŒ ์‹คํ–‰, ์žˆ์„ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ’์ด ๋ณ€ํ•  ๊ฒฝ์šฐ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋•Œ ๋””ํŽœ๋˜์‹œ๋Š” ์—ฌ๋Ÿฌ๊ฐœ ์ž…๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚  ๊ฒฝ์šฐ ๋ชจ๋“  ์ž์‹๋“ค์ด ๋ฆฌ๋ Œ๋”๋ง์ด ๋œ๋‹ค.
propType์„ ์„ค์น˜ํ•˜๊ณ  props์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ isRequired๋กœ ํ•„์ˆ˜๊ฐ’์„ ์ง€์ • ๊ฐ€๋Šฅ

๊ทธ๋ฆฌ๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ ์˜ค๋Š˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ํ™”๋ฉด์„ ๋ฐ”๋กœ ๋ฐ”๋กœ ๋ชป๋”ฐ๋ผ๊ฐ€์„œ ์กฐ๊ฑด๋ฌธ์„ ์ œ๋Œ€๋กœ ์ž‘์„ฑํ•˜์ง€ ๋ชปํ–ˆ๋Š”๋ฐ php์—์„œ ๊ทธ๋žฌ๋˜ ์‹ค์ˆ˜๊ฐ€ ๋งŽ์•„์„œ ๋ฐ”๋กœ ์ฐพ์•„๋‚ด์—ˆ๋‹ค๋ฉฐ ^^

profile
mi carro es bonito

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด