[TIL] Day34 #useEffect

Beanxxยท2022๋…„ 6์›” 14์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
34/120
post-thumbnail

2022.06.14(Tues)

[TIL] Day34
[SEB FE] Day34

โ˜‘๏ธย React ๋ฐ์ดํ„ฐ ํ๋ฆ„

โžฐย React ๊ฐœ๋ฐœ ๋ฐฉ์‹์€ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ์‹œ์ž‘! (ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ ์ด์ „์—, ์ปดํฌ๋„ŒํŠธ ๋จผ์ € ๋งŒ๋“ค๊ณ  ์กฐ๋ฆฝ)

๐Ÿ‘‰ย โ€™์ƒํ–ฅ์‹(bottom-up)โ€™์œผ๋กœ ์•ฑ ์ œ์ž‘ (ํ…Œ์ŠคํŠธ easy, ํ™•์žฅ์„ฑ good)

โžฐย ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ฃผ์ฒด๋Š” โ€˜๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ ๐Ÿ‘‰ย ๋ฐ์ดํŠธ ํ๋ฆ„ โ€˜ํ•˜ํ–ฅ์‹(top-down)โ€™

โœ…ย React๋Š” ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„(One-way data flow)

๐Ÿ“Žย State ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ(Lifting State Up)

์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ โ€˜์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ํ•จ์ˆ˜(handler)' ๊ทธ ์ž์ฒด๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— props๋กœ ์ „๋‹ฌํ•˜๊ณ , ์ด ํ•จ์ˆ˜๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰

// example
export default function ParentComponent() {
  const [value, setValue] = useState("Change Me!");

  const handleChangeValue = (newValue) => {
    setValue(newValue);
  };

  return (
    <div>
      <div>๊ฐ’: {value}</div>
      <ChildComponent handleButtonClick={handleChangeValue} />
    </div>
  );
}

function ChildComponent({ handleButtonClick }) {
  const handleClick = () => {
    handleButtonClick("Here! value!");
  };

  return <button onClick={handleClick}>Change Value</button>;
}

โ˜‘๏ธย Effect Hook

๐Ÿ“Žย Side Effect (๋ถ€์ˆ˜ ํšจ๊ณผ)

ํ•จ์ˆ˜ ๋‚ด์—์„œ์˜ ์–ด๋– ํ•œ ๊ตฌํ˜„์ด ํ•จ์ˆ˜ ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ๊ฒฝ์šฐ Side Effect ๋ฐœ์ƒ

๐Ÿ“Žย Pure Function

์˜ค์ง ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๋งŒ์ด ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ํ•จ์ˆ˜ ์˜๋ฏธ (์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋œ ๊ฐ’ ์ˆ˜์ • โŒ)
โœ‹ย ํ•จ์ˆ˜ ์ž…๋ ฅ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ’์ด ํ•จ์ˆ˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ๋• ์ˆœ์ˆ˜ ํ•จ์ˆ˜ โŒ

  • Side Effect ์กด์žฌ โŒย (ex. ๋„คํŠธ์›Œํฌ ์š”์ฒญ)
  • ์–ด๋– ํ•œ ์ „๋‹ฌ ์ธ์ž๊ฐ€ ์ฃผ์–ด์งˆ ๊ฒฝ์šฐ, ํ•ญ์ƒ ๋˜‘๊ฐ™์€ ๊ฐ’ ๋ฆฌํ„ด ๋ณด์žฅ ๐Ÿ‘‰ย ์˜ˆ์ธก ๊ฐ€๋Šฅ ํ•จ์ˆ˜

โœ‹ย Ajax ์š”์ฒญ์€ ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜ โŒ

โœ…ย React์—์„œ React์™€ ์ƒ๊ด€์—†๋Š” API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Š” Side Effect

๐Ÿ‘‰ ์ด๋Ÿฌํ•œ Side Effect๋ฅผ React์—์„œ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Effect Hook ์ œ๊ณต

๐Ÿ“Žย useEffect

์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ Side effect๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” Hook

๐Ÿคทโ€โ™€๏ธย When ์‹คํ–‰?

  • ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ ํ›„ ์ฒ˜์Œ ํ™”๋ฉด์— ๋ Œ๋”๋ง(ํ‘œ์‹œ)
  • ์ปดํฌ๋„ŒํŠธ์— ์ƒˆ๋กœ์šด props๊ฐ€ ์ „๋‹ฌ๋˜๋ฉฐ ๋ Œ๋”๋ง
  • ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ(state)๊ฐ€ ๋ฐ”๋€Œ๋ฉฐ ๋ Œ๋”๋ง
    ๐Ÿ‘‰ย ๋งค๋ฒˆ ์ƒˆ๋กญ๊ฒŒ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ Effect Hook ์‹คํ–‰

โœ‹ย ์ตœ์ƒ์œ„์—์„œ๋งŒ Hook ํ˜ธ์ถœ

โœ‹ย React ํ•จ์ˆ˜ ๋‚ด์—์„œ Hook ํ˜ธ์ถœ

โœ‹ย ๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜ ๋‚ด์—์„œ Hook ํ˜ธ์ถœ โŒ

โžฐย ์ข…์†์„ฑ ๋ฐฐ์—ด (dependency array)

useEffect(ํ•จ์ˆ˜, [์ข…์†์„ฑ1, ์ข…์†์„ฑ2, ...])

  • 2๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฐฐ์—ด(์ข…์†์„ฑ ๋ฐฐ์—ด)๋กœ, ์กฐ๊ฑด์„ ๋‹ด๊ณ  ์žˆ์Œ

    • ์กฐ๊ฑด: ์–ด๋–ค ๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ ๐Ÿ‘‰ย ์–ด๋–ค ๊ฐ’์˜ ๋ชฉ๋ก์ด ๋“ค์–ด๊ฐ
      • ๋ฐฐ์—ด ๋‚ด์˜ ์ข…์†์„ฑ1 ๋˜๋Š” ์ข…์†์„ฑ2.. ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ, 1๋ฒˆ์งธ ์ธ์ž ํ•จ์ˆ˜ ์‹คํ–‰
    // 2๋ฒˆ์งธ ์ธ์ž์— ์•„๋ฌด๊ฒƒ๋„ ์ž‘์„ฑํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
    // 1. ์ปดํฌ๋„ŒํŠธ ์ฒ˜์Œ ์ƒ์„ฑ, 2. props ์—…๋ฐ์ดํŠธ, 3. state ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰
    useEffect(() => {
        console.log("๋ช‡ ๋ฒˆ ํ˜ธ์ถœ?");
    })
    
    // 2๋ฒˆ์งธ ์ธ์ž๋กœ [] ๋นˆ ๋ฐฐ์—ด์„ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ
    // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ์ƒ์„ฑ๋  ๋•Œ๋งŒ ํ•จ์ˆ˜ ์‹คํ–‰
    // ex. ์ฒ˜์Œ์— ํ•œ๋ฒˆ๋งŒ ์™ธ๋ถ€ API๋กœ ๋ฆฌ์†Œ์Šค ๋ฐ›์•„์˜ค๊ณ  ๋” ์ด์ƒ API ํ˜ธ์ถœ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉ
    useEffect(() => {
        console.log("๋ช‡ ๋ฒˆ ํ˜ธ์ถœ?");
    }, [])
    
    // 2๋ฒˆ์งธ ์ธ์ž๋กœ [num]์„ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ
    // num์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰
    useEffect(() => {
        console.log("๋ช‡ ๋ฒˆ ํ˜ธ์ถœ?");
    }, [num])
    

โžฐย ๋กœ๋”ฉ ํ™”๋ฉด ์ฒ˜๋ฆฌ

const [isLoading, setIsLoading] = useState(true);

// fetch ์ „, ํ›„๋กœ setIsLoading ์„ค์ •ํ•ด์ฃผ๋ฉด Good
useEffect(() => {
  setIsLoading(true);
  fetch(`http://์„œ๋ฒ„์ฃผ์†Œ/proverbs?q=${filter}`)
    .then(resp => resp.json())
    .then(result => {
      setProverbs(result);
      setIsLoading(false);
    });
}, [filter]);

return (
	{isLoading ? <LoadingIndicator /> : <div>Loading Success Page</div>}	
)


โœ๏ธ ์˜ค๋Š˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์‰ฌ์šด ๋ฌธ์ œ 2๊ฐœ ํ’€์—ˆ๋‹ค. ์‰ฌ์šด ๋ฌธ์ œ๋„ ์—„์—ฐํ•œ ๋ฌธ์ œ๋‹ˆ๊นŒ^^
๐Ÿซ  ์ ์  ๊ฐˆ์ˆ˜๋ก React ๊ฐœ๋…์ด ํ˜ผ๋™์Šค๋Ÿฝ๋‹ค,, ์˜ค๋Š˜ ๋ณ„์ฝ”๋”ฉ, ํ•œ์ž… ๋ฆฌ์•กํŠธ ๊ฐ•์˜ ์ข€ ๋ณด๋‹ค๊ฐ€ ์ž์•ผ์ง€

profile
FE developer

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