๐คทโ๏ธ Rendering๋?
useLayoutEffect์ ๋ํด์ ์์๋ณด๊ธฐ ์ ์ ๋ฆฌ์กํธ์์ ๊ฐ์ฅ ์ค์ํ ๋ ๋๋ง ๊ณผ์ ๊ฐ๋จํ๊ฒ ์์๋ณด๊ฒ ์ต๋๋ค.
๋ ๋๋ง(Rendering)์ด๋?
์ฝ๊ฒ ์ค๋ช ํด์ HTML, CSS, JavaScript ๋ฌธ์๋ฅผ ์ฝ๊ณ ๋ธ๋ผ์ฐ์ ์ UI ๊ทธ๋ฆฌ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค.
React hooks useSate ์ ๋ํด์
https://cometruedream.tistory.com/73
๐คทโ๏ธ useLayoutEffect๋?
useLayoutEffect๋ useEffect์๋ ๋์๋ฐฉ์์ด ๋ค๋ฆ ๋๋ค.
react hook์ค ํ๋๋ก useLayoutEffect๋ ๋ ๋๋ง ๋ ํ UI ์ ์ฉ๋๊ธฐ ์ ์ ์คํ๋๋ ํจ์์ ๋๋ค.
๋ฐ๋ฉด์ useEffect UI ์ ์ฉ๋ ์ดํ์ ์คํ๋ฉ๋๋ค. ์ด ๋ผ์ดํ์ฌ์ดํด์ ์ฐจ์ด์ ์ ์ดํดํ๋๊ฒ์ ์ค์ํฉ๋๋ค.
์ฆ, UI ๊ทธ๋ ค์ง๊ธฐ ์ ์ ์คํ๋๊ธฐ ๋๋ฌธ์ DOM์ ์กฐ์ํ๋ ์ฝ๋๊ฐ ์กด์ฌํ๋๋ผ๋ ์ฌ์ฉ์๋ ๊น๋นก์์ ๊ฒฝํํ์ง ์๊ณ ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ UI๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๋ค.
react hook ๊ณต์๋ฌธ์
https://react.dev/reference/react/useLayoutEffect
๐คทโ๏ธ useLayoutEffect์ useEffect ์ฐจ์ด์ ?
- useEffect: ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋ฉ๋๋ค. ํ๋ฉด์ด ๋ ๋๋ง๋ ํ, ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๊ทธ๋ฆฐ ๋ค์์ ์คํ๋ฉ๋๋ค.
- useLayoutEffect: ๋๊ธฐ์ ์ผ๋ก ์คํ๋ฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ์งํ, ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ธฐ ์ ์ ์คํ๋ฉ๋๋ค.
๐คทโ๏ธ useLayoutEffect ์ฌ์ฉ๋ฒ
useLayoutEffect hook ์ฌ์ฉ๋ฐฉ๋ฒ์ useEffect์ ๋์ผํฉ๋๋ค.
useEffect(() => {
// ๋ก์ง
return () => /* cleanup */
}, [dependancy array]);
useLayoutEffect(() => {
// ๋ก์ง
return () => /* cleanup */
}, [dependancy array]);
์ฃผ์์
๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด, useLayoutEffect๋ ์ฑ๋ฅ์ ์ ํ์ํฌ ์์ด์ useEffect๋ฅผ ๊ถ์ฅํ๋ค๊ณ ์ธ๊ธํฉ๋๋ค.
๊ผญ ํ์ํ ์ํฉ์ด ์๋๋ผ๋ฉด ์ฑ๋ฅ์ ์ ํ์ํค๋ useLayoutEffect๋ณด๋ค useEffect๋ฅผ ์ฌ์ฉํ์๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
*์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ธ ๊ฒฝ์ฐ์๋ useLayoutEffect์ useEffect ์คํ๋์ง ์์ต๋๋ค!
๐คทโ๏ธ useLayoutEffect ์ฌ์ฉ์์
๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ์ค์ ์์ต๋๋ค.
import React, { useLayoutEffect, useRef, useState } from "react";
function App() {
const [height, setHeight] = useState(123);
const divRef = useRef();
useLayoutEffect(() => {
// div ์์์ ๋์ด๋ฅผ ์ธก์ ํ์ฌ ์ํ์ ์ ์ฅ
if (divRef.current) {
setHeight(divRef.current.getBoundingClientRect().height);
}
}, []); // ๋น ๋ฐฐ์ด์ ๋๋ฒ์งธ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ฉด, ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
return (
<div>
<div ref={divRef} style={{ padding: "20px", border: "1px solid black" }}>
์ธก์ ํ div ์์์
๋๋ค.
</div>
<p>์ด div ์์์ ๋์ด๋ {height}px ์
๋๋ค.</p>
</div>
);
}
export default App;
์์ ์ฝ๋๋ฅผ ์ค๋ช
- useRef๋ฅผ ์ฌ์ฉํ์ฌ div ์์๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
- useLayoutEffect๋ฅผ ์ฌ์ฉํ์ฌ UI๋ฅผ ๋ ๋๋ง ํ๊ธฐ ์ ์ useRef๋ฅผ ์ฐธ์กฐํ div ๋์ด๋ฅผ ์ธก์ ํ๊ณ ์ํ๋ฅผ ์ ์ฅํฉ๋๋ค.
- height์ div์์์ ๋์ด ๊ฐ์ ํ๋ฉด์์ ๋ณด์ค์ ์์ต๋๋ค.
์์ ์ฝ๋๋ฅผ ์ดํดํ๋ ๊ฒ์ ์ค์ํ์ง ์์ต๋๋ค.
์ค์ํ๊ฒ์ useLayoutEffect hook ์ธ์ ์ํํ๋๋? ๋ธ๋ผ์ฐ์ ์ UI ํ๋ฉด์ ๊ทธ๋ฆฌ๊ธฐ ์ ์ ํธ์ถ๋์ด์ ์คํ๋์์ต๋๋ค.
๐คทโ๏ธ ๋ง์ง๋ง์ผ๋ก
๋ฆฌ์กํธ์ useLayoutEffect ํ ์ ๋ํด์ ์์๋ดค์ต๋๋ค.
๋ธ๋ผ์ฐ์ UI๊ฐ ๊ทธ๋ ค์ง๊ธฐ์ ์ ๊น๋ฐ์ ์์ด, ๋น ๋ฅด๊ฒ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ DOM์กฐ์์ด ํ์ํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ์ค ์ ์๋ ํ ์ ๋๋ค.
ํ์ง๋ง useLayoutEffect ์ฑ๋ฅ์ ํ์ ์์ธ์ด ๋ ์ ์์ผ๋ฏ๋ก ๊ผญ ํ์ํ ๊ฒฝ์ฐ์ ์ฌ์ฉํ์๊ณ useEffect hook์ ์ฌ์ฉํ์๋ ๊ฒ์ ๊ถ์ฅ๋๋ฆฝ๋๋ค.
์ฌ๋ฐ๋ ์ค๋์ ๋ ๋ณ ์ด์ธ ๋ณด๊ณ ๊ฐ์ธ์!
https://cometruedream.tistory.com/247
https://cometruedream.tistory.com/243
https://cometruedream.tistory.com/242
https://cometruedream.tistory.com/241
https://cometruedream.tistory.com/244
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React ๊ฐ๋ฐ์๋ฅผ ์ํ TypeScript์ Hooks ์ฌ์ฉ ํ ๋ฐ ์์ (1) | 2024.08.08 |
---|---|
๋ฆฌ์กํธ ์ ์ด vs ๋น์ ์ด ์ปดํฌ๋ํธ ์์๋ณด๊ธฐ (0) | 2024.08.02 |
[React-query] ๋ฐ์ดํฐํต์ ์ ์ํ useMutation ๊ฐ๋ ๊ณผ hooks ์ฌ์ฉ๋ฒ (29) | 2024.07.16 |
[React-query] ๋ฐ์ดํฐ ํ๋ฆฌํ์นญ ์ฌ์ฉ๋ฒ ์ ๋ฆฌ (1) | 2024.06.19 |
[React] Tailwind ํ์ค, ๋์ค, ์ธ์ค ํจ๊ณผ className ์ปค์คํ (1) | 2024.06.03 |