ram2 ๐Ÿš—

[react] useEffect() ๋ณธ๋ฌธ

๐Ÿ–ฅ๏ธ react

[react] useEffect()

coram22 2022. 12. 27. 18:21
728x90
๋ฐ˜์‘ํ˜•
728x90

state

props

.

.

 

ํŠน์ • ์ฝ”๋“œ๋“ค์ด ์ฒซ ๋ฒˆ์งธ component render์—์„œ๋งŒ ์‹คํ–‰๋˜๊ฒŒ ํ•˜์ž.

์ฒ˜์Œ ํ•œ ๋ฒˆ๋งŒ..!!

๋‚˜์ค‘์—๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€ํ•ด๋„ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก.

์šฐ๋ฆฌ๊ฐ€ state๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ชจ๋“  code๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค. 

ํ•˜์ง€๋งŒ ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์„ ๊ฒฝ์šฐ!! ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

useEffect๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด useEffect๋Š” ๋‘ ๊ฐœ์˜ argument๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ์ฒซ ๋ฒˆ์งธ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ์ด๋‹ค.

ex) useEffect(function1, [])

๋‘๋ฒˆ์งธ๋Š” ... ๋งˆ๋ฒ•๊ฐ™๋‹ค....?

 

๊ฒฐ๊ตญ, useEffect์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๊ณ„์† ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ. 

ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•ด๋„ ๋˜๋Š” ๊ฒƒ๋“ค์„ ๋‹ค๋ฃจ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

 

๋‘ ๋ฒˆ์งธ argument๋Š”..

์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ํŠน์ •ํ•œ ๋ถ€๋ถ„์ด ๋ณ€ํ–ˆ์„ ๋•Œ๋งŒ ๋‹ค์‹œ ์ฐํžˆ๋„๋ก ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ!

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒ€์ƒ‰ ์ฐฝ์—์„œ ๋ฌธ์ž๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ๊ฒ€์ƒ‰ ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅธ๋‹ค๋ฉด ๊ฐ™์€ ๋‹จ์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๊ทธ ์ƒํƒœ์—์„œ ๋ฒ„ํŠผ์„ ์—ฌ๋Ÿฌ๋ฒˆ ํด๋ฆญํ•˜๋ฉด ํด๋ฆญ ํ•  ๋•Œ๋งˆ๋‹ค ์ƒํƒœ๊ฐ€ ๋ณ€ํ•œ๋‹ค. ์ฆ‰, ํ…์ŠคํŠธ ํ•„๋“œ๋Š” ๋ณ€ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์† ์ฐ์–ด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ„์œผ๋กœ์จ counter๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ๋„ ์˜ํ™”๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

useEffect(() => {
 console.log("SEARCH FOR", keyword); //keyword๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ๋งŒ ์‹คํ–‰๋œ๋‹ค.
}, [keyword]);

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด keyword๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๊ฑฐ๋ผ๊ณ  react.js์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ ๋‘ ๋ฒˆ์งธ argument๋ฅผ []๋กœ ๋น„์›Œ๋’€์„ ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋๋˜ ์ด์œ ๋Š” ๋น„์–ด์žˆ์œผ๋ฏ€๋กœ ์ง€์ผœ๋ณผ ๋ณ€ํ™”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฆ‰, ๋‘ ๋ฒˆ์งธ argument๋ฅผ ์ฑ„์šฐ๋ฉด, 'ํ•ด๋‹น argument๊ฐ€ ๋ณ€ํ™”ํ•˜๋Š”์ง€ ์ง€์ผœ๋ด์ค˜' ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

 


๋ณต์Šต!!!!

๋ฆฌ์—‘ํŠธ์—์„œ๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค UI๋ฅผ refresh ํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ํŽธํ•˜๋‹ค.

ํ•˜์ง€๋งŒ! ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ํ˜น์€ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ! ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”๊ฐ€!!

์ด ๋•Œ useEffect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
์ด ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐœ์˜ argument๋ฅผ ๊ฐ–๋Š”๋ฐ,

์ฒซ ๋ฒˆ์งธ argument๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ์€ ์ฝ”๋“œ์ด๊ณ ,

๋‘ ๋ฒˆ์งธ argument๋Š” dependencies๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค. ์ด๋Š” react.js๊ฐ€ ์ง€์ผœ๋ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์ด ๋ณ€ํ™”ํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ argument๋ฅผ refresh ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 ๋‘ ๋ฒˆ์งธ argument๋Š” array์ด๋ฏ€๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ component๋ฅผ ๋„ฃ์–ด๋„ ๋œ๋‹ค.

 

๊ฒฐ๋ก 

useEffect๋Š” ์›ํ•˜๋Š” state์ด ๋ณ€ํ•  ๋•Œ๋งŒ ์›ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค!!

react.js๋Š” ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค refresh ํ•˜๋Š”๋ฐ, useEffect๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ refresh ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

[ ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์ž์ฃผ ์“ฐ์ด๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ]

Cleanup function

์ด ํ•จ์ˆ˜๋Š” ๊ทธ๋ƒฅ ํ•จ์ˆ˜์ธ๋ฐ, ์šฐ๋ฆฌ์˜ component๊ฐ€ destroy๋  ๋•Œ ๋ญ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

Cleanup function์€ ๋”ฐ๋กœ ์ด ์ด๋ฆ„์˜ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ useEffect์—์„œ component๊ฐ€ ์—†์–ด์งˆ ๋•Œ ๋ฌด์–ธ๊ฐ€๋ฅผ returnํ•˜๋Š” ๊ฒƒ.

์ด๋Š” component๊ฐ€ ์—†์–ด์งˆ ๋•Œ ์–ด๋–ค ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋‚ด๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์–ธ์ œ component๊ฐ€ create ๋๋Š”์ง€, ์–ธ์ œ destroy ๋๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

function Hello() {
 function byFn() {
  console.log("bye :(");
 }
 function hiFn() {
  console.log("created :)");
  return byFn; // React.js๊ฐ€ hiFn์„ ์‹คํ–‰ํ•˜๊ณ , hiFn์ด ํŒŒ๊ดด๋  ๋•Œ byFn์„ ์‹คํ–‰ํ•œ๋‹ค.
 }
 useEffect(hiFn, []);
 return <h1>Hello</h1>;
}

 

๋ฌผ๋ก  ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์ ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

function Hello() {
 useEffect(() => {
  console.log("hi :)");
  return () => console.log("bye :(");
 }, []);

 useEffect(function () {
  console.log("hi :)");
  return function() {
   console.log("bye :(");
  };
 }, []);
 return <h1>Hello</h1>;
}

 

728x90
๋ฐ˜์‘ํ˜•