web/react hook
useLayoutEffect
dev_been94
2024. 12. 14. 12:09
728x90
๋ฐ์ํ
๐ฏ useLayoutEffect๋ ๋ฌด์์ผ๊น์?
**useLayoutEffect**๋ **DOM(ํ๋ฉด ์์)**์ด ๊ทธ๋ ค์ง๊ธฐ ์ ์ ์คํ๋๋ React ํ ์ด์์.
"๊ทธ๊ฒ ๋ฌด์จ ๋ง์ด์ฃ ?" ํ๊ณ ๊ถ๊ธํ ์ ์์ฃ ?
React์์ ํ๋ฉด์ด ์
๋ฐ์ดํธ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๊ฐ ์์ด์:
- ์ปดํฌ๋ํธ ๋ ๋๋ง → ํ๋ฉด์ ๋ฟ๋ฆด ์ค๋น๋ฅผ ํจ.
- DOM ์ ๋ฐ์ดํธ → ํ๋ฉด์ ์ค์ ๋ก ์์๋ฅผ ๊ทธ๋ ค์.
- useEffect ์คํ → ํ๋ฉด์ด ๋ค ๊ทธ๋ ค์ง ๋ค์์ ์คํ๋ผ์.
- 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;
๐ ์ฝ๋์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ๊น์?
- useLayoutEffect
- ํ๋ฉด์ด ๊ทธ๋ ค์ง๊ธฐ ์ง์ ์ ์คํ๋ฉ๋๋ค.
- getBoundingClientRect()๋ฅผ ์ฌ์ฉํด ์์์ ๋์ด๋ฅผ ๊ฐ์ ธ์์ ์ํ์ ์ ์ฅํด์.
- useEffect
- ํ๋ฉด์ด ๋ค ๊ทธ๋ ค์ง ์ดํ์ ์คํ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ
- useLayoutEffect๊ฐ ๋จผ์ ์คํ๋๋๊น, ํ๋ฉด์ ๊ทธ๋ ค์ง ๋ ์ด๋ฏธ ์ ํํ ๋์ด ๊ฐ์ด ์ค์ ๋ผ ์์ด์.
- useEffect๋ ๊ทธ ์ดํ์ ์คํ๋๋๊น ํ์ด๋ฐ์ด ๋ฌ๋ผ์.
๐ฆ useLayoutEffect๋ฅผ ์ธ์ ์ฌ์ฉํ ๊น์?
- ํ๋ฉด์ด ๊ทธ๋ ค์ง๊ธฐ ์ ์ ์์์ ํฌ๊ธฐ๋ ์์น๋ฅผ ์ ํํ๊ฒ ๊ณ์ฐํด์ผ ํ ๋
- ์: ์ ๋๋ฉ์ด์ , ๋ ์ด์์ ์กฐ์ , ์คํฌ๋กค ์์น ์ค์ ๋ฑ
- ํ๋ฉด ๊น๋นก์(Flash)์ด๋ ๋ ์ด์์์ด ํ๋ ํ์์ ๋ฐฉ์งํด์ผ ํ ๋
- useEffect๋ ํ๋ฉด์ด ๋ค ๊ทธ๋ ค์ง ํ์ ์คํ๋๋๊น ์ ๊น ๊น๋นก์ผ ์ ์์ด์.
- useLayoutEffect๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋๋ง์ด ๋๋๊ธฐ ์ ์ ๋ฐ๋ก ์์ ์ด ์ ์ฉ๋ผ์.
๐จ ์ฃผ์ํ ์
- useLayoutEffect๋ ๋๊ธฐ์ ์ผ๋ก ์คํ๋ผ์.
→ ํ๋ฉด์ด ๊ทธ๋ ค์ง๊ธฐ ์ง์ ์ ์คํ๋๋๊น ๋ ๋๋ง์ ์ ๊น ๋ง์ ์ ์์ด์. - ๋๋ฌด ๋ง์ ์์ ์ ๋ฃ์ผ๋ฉด ํ๋ฉด์ด ๋๋ ค์ง ์ ์์ผ๋๊น ๊ผญ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ์ธ์!
๐ ํ ์ค ์์ฝ
useLayoutEffect๋ ํ๋ฉด์ด ๊ทธ๋ ค์ง๊ธฐ ์ ์ ์คํ๋ผ์ ๋ ์ด์์์ด๋ ์คํ์ผ์ ์กฐ์ ํ๋ ๋ฐ ์ ์ฉํ React ํ ์ด์์.
728x90
๋ฐ์ํ