Frontend ๐Ÿ“š/React

[React] useLayoutEffect, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง etc.

leejaejae 2024. 7. 5. 17:13

1. useLayoutEffect
2. ์ปดํฌ๋„ŒํŠธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง


1. useLayoutEffect ์ด๋ž€ โญ๏ธ

  • ๋ฆฌ์•กํŠธ ํ›… ํ•จ์ˆ˜๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Œ

  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ .jsํŒŒ์ผ์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์œผ๋กœ ๊ถŒํ•œ์„ ๋„˜๊ฒจ .js ํ•ด๋‹น ํŒŒ์ผ์„ ํŒŒ์‹ฑํ•˜๊ณ  ๊ทธ๋ฆฌ๊ฒŒ ๋จ
  • ์œ„ ๊ทธ๋ฆผ์˜ ํ›… ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๋ณด๋‹ค์‹œํ”ผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์Šคํฌ๋ฆฐ์— ํŽ˜์ธํŒ… ์ž‘์—…์ด ์™„๋ฃŒ๋œ ์ดํ›„ useEffect๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์กŒ์Œ
  • ๋”ฐ๋ผ์„œ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋ Œ๋”๋งํ•  ๋•Œ useState(0)๊ณผ ๊ฐ™์€ ์ดˆ๊ธฐ useState์˜ ๊ฐ’์ด ๋นˆ ๊ฐ’์ด๋ผ๋ฉด, 0์„ ์ถœ๋ ฅํ–ˆ๋‹ค๊ฐ€ useEffect๋ฅผ ํ†ตํ•ด ์ฑ„์›Œ์ง€๋Š” ๊ตฌ์กฐ๋ฅผ ๋”
// ์ฝ”๋“œ ์ฐธ๊ณ : https://merrily-code.tistory.com/46

import { useEffect, useState } from 'react';

function App() {
  const [age, setAge] = useState(0);
  const [name, setName] = useState('');

  useEffect(() => {
    setAge(25);
    setName('์ฐฌ๋ฏผ');
  }, []);

  return (
    <>
      <div className='App'>{`๊ทธ์˜ ์ด๋ฆ„์€ ${name} ์ด๋ฉฐ, ๋‚˜์ด๋Š” ${age}์‚ด ์ž…๋‹ˆ๋‹ค.`}</div>
    </>
  );
}

export default App;

  • useLayoutEffect๋Š” ๋ฐ”๋กœ ์ด๋Ÿฐ ๋ฌธ์ œ(↑)๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ํ›…์ž„

  • useLayoutEffect๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ™”๋ฉด์— DOM์„ ๊ทธ๋ฆฌ๊ธฐ ์ „์— ์ดํŽ™ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•จ
    ๋”ฐ๋ผ์„œ ์œ„์˜ ์ฝ”๋“œ ์‹คํ–‰ ์ˆœ์„œ๋„ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž„
    1. ๋ ˆ์ด์•„์›ƒ ์ดํŽ™ํŠธ ๋‚ด๋ถ€์˜ setNumber, setName ํ˜ธ์ถœ
    2. <div>๊ทธ์˜ ์ด๋ฆ„์€ ์ฐฌ๋ฏผ์ด๋ฉฐ, ๋‚˜์ด๋Š” 25์‚ด ์ž…๋‹ˆ๋‹ค.</div>๋ฅผ ํŽ˜์ธํŠธ
// ์ฝ”๋“œ ์ฐธ๊ณ : https://merrily-code.tistory.com/46

import { useLayoutEffect, useState } from 'react';

function App() {
  const [age, setAge] = useState(0);
  const [name, setName] = useState('');

  useLayoutEffect(() => {
    setAge(25);
    setName('์ฐฌ๋ฏผ');
  }, []);

  return (
    <>
      <div className='App'>{`๊ทธ์˜ ์ด๋ฆ„์€ ${name} ์ด๋ฉฐ, ๋‚˜์ด๋Š” ${age}์‚ด ์ž…๋‹ˆ๋‹ค.`}</div>
    </>
  );
}

export default App;

 

2. ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง โญ๏ธ

  • ์ด๋ฒคํŠธ๋กœ ์„ค์ •ํ•  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ง์ ‘ ๋„ฃ์–ด ์ค„ ๋•Œ๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„ฃ์–ด ์ฃผ์–ด์•ผ ํ•จ
case 1: ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฌธ๋ฒ•
<button onClick={this.setState({ number: number + 1})}>  (x)

case 2: ์ž‘๋™ํ•˜๋Š” ๋ฌธ๋ฒ•
<button onClick={()=> this.setState({ number: number + 1}; )}>  (o)

or
case 3: ์•„์˜ˆ ํ•จ์ˆ˜๋กœ ๋นผ์ฃผ๊ณ  ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ ์‚ฌ์šฉํ•œ๋‹ค.

const plusNum = (number) => {
  setState(number : number + 1);
}
...

<button onClick={plusNum}>+ 1 </button>

 

Tips. ๋ฆฌ์•กํŠธ์˜ ์„ฑ๋Šฅ ๊ฐœ์„  ๋ฐฉ๋ฒ•

  • hook ํ•จ์ˆ˜ ์‚ฌ์šฉ(useMemo, useCallback)
  • ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(react.lazy(), Next.js ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์šฉ ๋“ฑ)