ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

web/react hook

useLayoutEffect

dev_been94 2024. 12. 14. 12:09
728x90
๋ฐ˜์‘ํ˜•

useLayoutEffect

 

๐ŸŽฏ useLayoutEffect๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

**useLayoutEffect**๋Š” **DOM(ํ™”๋ฉด ์š”์†Œ)**์ด ๊ทธ๋ ค์ง€๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š” React ํ›…์ด์—์š”.

"๊ทธ๊ฒŒ ๋ฌด์Šจ ๋ง์ด์ฃ ?" ํ•˜๊ณ  ๊ถ๊ธˆํ•  ์ˆ˜ ์žˆ์ฃ ?
React์—์„œ ํ™”๋ฉด์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๊ฐ€ ์žˆ์–ด์š”:

  1. ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง → ํ™”๋ฉด์— ๋ฟŒ๋ฆด ์ค€๋น„๋ฅผ ํ•จ.
  2. DOM ์—…๋ฐ์ดํŠธ → ํ™”๋ฉด์— ์‹ค์ œ๋กœ ์š”์†Œ๋ฅผ ๊ทธ๋ ค์š”.
  3. useEffect ์‹คํ–‰ → ํ™”๋ฉด์ด ๋‹ค ๊ทธ๋ ค์ง„ ๋‹ค์Œ์— ์‹คํ–‰๋ผ์š”.
  4. useLayoutEffect ์‹คํ–‰ → ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€๊ธฐ ์ง์ „์— ์‹คํ–‰๋ผ์š”.

 

๐Ÿข useEffect์™€ useLayoutEffect์˜ ์ฐจ์ด์  ๋น„์œ 

์—ฌ๋Ÿฌ๋ถ„์ด ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ํ™”๊ฐ€๋ผ๊ณ  ์ƒ์ƒํ•ด ๋ณผ๊ฒŒ์š”. ๐ŸŽจ

  • **useEffect**๋Š” ๊ทธ๋ฆผ์ด ์™„์ „ํžˆ ๋‹ค ๊ทธ๋ ค์ง„ ํ›„์— ์ž‘์—…ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”.
    → "๊ทธ๋ฆผ์„ ๋‹ค ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ์•ก์ž์— ๋„ฃ๋Š”๋‹ค."
  • **useLayoutEffect**๋Š” ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง€๊ธฐ ์ง์ „์— ์ž‘์—…ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”.
    → "๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๊ธฐ ์ง์ „์— ์บ”๋ฒ„์Šค ํฌ๊ธฐ๋‚˜ ์œ„์น˜๋ฅผ ๋ฏธ๋ฆฌ ์กฐ์ •ํ•œ๋‹ค."

 

๐Ÿ› ๏ธ useLayoutEffect ์ฝ”๋“œ ์˜ˆ์‹œ

ํ™”๋ฉด์— ์š”์†Œ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ „์— ํฌ๊ธฐ๋‚˜ ์œ„์น˜๋ฅผ ์กฐ์ •ํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆด๊ฒŒ์š”.

import React, { useState, useEffect, useLayoutEffect, useRef } from "react";

function BoxExample() {
  const [height, setHeight] = useState(0);
  const boxRef = useRef();

  // useLayoutEffect: ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€๊ธฐ ์ง์ „์— ์‹คํ–‰๋ผ์š”.
  useLayoutEffect(() => {
    const box = boxRef.current;
    const boxHeight = box.getBoundingClientRect().height; // ์š”์†Œ ๋†’์ด ๊ฐ€์ ธ์˜ค๊ธฐ
    setHeight(boxHeight);
    console.log("useLayoutEffect ์‹คํ–‰๋จ! ์š”์†Œ ๋†’์ด:", boxHeight);
  }, []);

  // useEffect: ํ™”๋ฉด์ด ๋‹ค ๊ทธ๋ ค์ง„ ํ›„์— ์‹คํ–‰๋ผ์š”.
  useEffect(() => {
    console.log("useEffect ์‹คํ–‰๋จ!");
  }, []);

  return (
    <div>
      <div
        ref={boxRef}
        style={{
          width: "200px",
          height: "100px",
          backgroundColor: "lightblue",
        }}
      >
        ์ด ๋ฐ•์Šค์˜ ๋†’์ด: {height}px
      </div>
    </div>
  );
}

export default BoxExample;

 

๐Ÿ” ์ฝ”๋“œ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ ๊นŒ์š”?

  1. useLayoutEffect
    • ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€๊ธฐ ์ง์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    • getBoundingClientRect()๋ฅผ ์‚ฌ์šฉํ•ด ์š”์†Œ์˜ ๋†’์ด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ƒํƒœ์— ์ €์žฅํ•ด์š”.
  2. useEffect
    • ํ™”๋ฉด์ด ๋‹ค ๊ทธ๋ ค์ง„ ์ดํ›„์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  3. ๊ฒฐ๊ณผ
    • useLayoutEffect๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๋‹ˆ๊นŒ, ํ™”๋ฉด์— ๊ทธ๋ ค์งˆ ๋•Œ ์ด๋ฏธ ์ •ํ™•ํ•œ ๋†’์ด ๊ฐ’์ด ์„ค์ •๋ผ ์žˆ์–ด์š”.
    • useEffect๋Š” ๊ทธ ์ดํ›„์— ์‹คํ–‰๋˜๋‹ˆ๊นŒ ํƒ€์ด๋ฐ์ด ๋‹ฌ๋ผ์š”.

 

๐Ÿšฆ useLayoutEffect๋ฅผ ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ์š”?

  1. ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€๊ธฐ ์ „์— ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๊ณ„์‚ฐํ•ด์•ผ ํ•  ๋•Œ
    • ์˜ˆ: ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋ ˆ์ด์•„์›ƒ ์กฐ์ •, ์Šคํฌ๋กค ์œ„์น˜ ์„ค์ • ๋“ฑ
  2. ํ™”๋ฉด ๊นœ๋นก์ž„(Flash)์ด๋‚˜ ๋ ˆ์ด์•„์›ƒ์ด ํŠ€๋Š” ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•  ๋•Œ
    • useEffect๋Š” ํ™”๋ฉด์ด ๋‹ค ๊ทธ๋ ค์ง„ ํ›„์— ์‹คํ–‰๋˜๋‹ˆ๊นŒ ์ž ๊น ๊นœ๋นก์ผ ์ˆ˜ ์žˆ์–ด์š”.
    • useLayoutEffect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ Œ๋”๋ง์ด ๋๋‚˜๊ธฐ ์ „์— ๋ฐ”๋กœ ์ž‘์—…์ด ์ ์šฉ๋ผ์š”.

 

๐Ÿšจ ์ฃผ์˜ํ•  ์ 

  • useLayoutEffect๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋ผ์š”.
    → ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€๊ธฐ ์ง์ „์— ์‹คํ–‰๋˜๋‹ˆ๊นŒ ๋ Œ๋”๋ง์„ ์ž ๊น ๋ง‰์„ ์ˆ˜ ์žˆ์–ด์š”.
  • ๋„ˆ๋ฌด ๋งŽ์€ ์ž‘์—…์„ ๋„ฃ์œผ๋ฉด ํ™”๋ฉด์ด ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”!

 

๐ŸŒŸ ํ•œ ์ค„ ์š”์•ฝ

useLayoutEffect๋Š” ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€๊ธฐ ์ „์— ์‹คํ–‰๋ผ์„œ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์Šคํƒ€์ผ์„ ์กฐ์ •ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ React ํ›…์ด์—์š”.

728x90
๋ฐ˜์‘ํ˜•

'web > react hook' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

useOptimistic  (0) 2024.12.14
useMemo  (2) 2024.12.14
useInsertionEffect  (0) 2024.12.14
useImperativeHandle  (1) 2024.12.14
useId  (0) 2024.12.14
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•
250x250