ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ฏ useInsertionEffect๋ ๋ฌด์์ผ๊น?
**useInsertionEffect**๋ React 18๋ถํฐ ๋ฑ์ฅํ ํน์ํ ํ
์ด์์.
์ฃผ๋ก CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์คํ์ผ๋ง ๊ด๋ จ ์ฝ๋๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์ฉํด์.
์ด ํ
์ ํต์ฌ ์ญํ ์ **"DOM์ด ์
๋ฐ์ดํธ๋๊ธฐ ์ ์ ์คํ์ผ ๊ฐ์ ๋ถ๊ฐ ์์
์ ๋จผ์ ์ํํ๋ ๊ฒ"**์ด์์.
๊ฐ๋จํ ๋งํด, ํ๋ฉด์ ๊ทธ๋ ค์ง๊ธฐ ์ง์ ์ ๋ฏธ๋ฆฌ ํ์ํ ์์
(์คํ์ผ ์ฝ์
๋ฑ)์ ํ ์ ์๊ฒ ๋์์ค์.
๐งต ์ค์ํ ๋น์ : ์ท ์ ํ๊ธฐ
์ท์ ์ ์ ๋๋ฅผ ์๊ฐํด๋ณผ๊น์? ๐
- ํ๋ฉด์ ์์(์ฌ๋)๊ฐ ๊ทธ๋ ค์ง๊ธฐ ์ ์ ์ท(์คํ์ผ)์ ๋ฏธ๋ฆฌ ์ ํ์ผ ๊น๋ํ๊ฒ ๋ณด์ด๊ฒ ์ฃ ?
- ๋ง์ฝ ์ท์ ์ ํ๋ ํ์ด๋ฐ์ด ๋ฆ์ด์ ํ๋ฉด์ ์์๊ฐ ๋จผ์ ๋ํ๋๋ฒ๋ฆฌ๋ฉด, ์ ๊น์ด๋ผ๋ ์คํ์ผ์ด ์ ์ฉ๋์ง ์์ ๋ชจ์ต์ด ๋ณด์ผ ์ ์์ด์.
**useInsertionEffect**๋ ์ด๋ฐ ์ํฉ์ ๋ฐฉ์งํ๊ณ , ํ๋ฉด์ด ๊ทธ๋ ค์ง๊ธฐ ์ ์ ์คํ์ผ์ด ๋จผ์ ์ ์ฉ๋ ์ ์๋๋ก ๋์์ฃผ๋ ์ญํ ์ ํด์.
๐ ๏ธ useInsertionEffect ์ฌ์ฉ ์์
React์์ useInsertionEffect๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋จํ ์ฝ๋ ์์๋ฅผ ๋ณด์ฌ๋๋ฆด๊ฒ์.
๐งฉ CSS ์ฝ์ ์๋๋ฆฌ์ค
useInsertionEffect๋ฅผ ์ฌ์ฉํด์ ํ๋ฉด์ด ๊ทธ๋ ค์ง๊ธฐ ์ ์ CSS ์คํ์ผ์ ๋์ ์ผ๋ก ์ฝ์ ํ๋ ์์ ์์.
import React, { useInsertionEffect, useState } from "react";
function StyledBox() {
const [color, setColor] = useState("blue");
// ํ๋ฉด์ด ๊ทธ๋ ค์ง๊ธฐ ์ ์ ์คํ์ผ์ ์ถ๊ฐ
useInsertionEffect(() => {
const style = document.createElement("style");
style.innerHTML = `
.dynamic-box {
width: 200px;
height: 200px;
background-color: ${color};
border: 2px solid black;
}
`;
document.head.appendChild(style); // ์คํ์ผ์ <head>์ ์ถ๊ฐ
return () => {
document.head.removeChild(style); // ์ ๋ฆฌ(clean-up) ์์
};
}, [color]); // color ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ์คํ
return (
<div>
<div className="dynamic-box"></div>
<button onClick={() => setColor("red")}>๋นจ๊ฐ์์ผ๋ก ๋ณ๊ฒฝ</button>
<button onClick={() => setColor("green")}>์ด๋ก์์ผ๋ก ๋ณ๊ฒฝ</button>
</div>
);
}
export default StyledBox;
๐ ์ฝ๋์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ๊น์?
- useInsertionEffect
- ์ด ํ ์ DOM์ด ๊ทธ๋ ค์ง๊ธฐ ์ง์ ์ ์คํ๋ผ์.
- ์คํ์ผ(<style>)์ <head> ํ๊ทธ์ ๋ฏธ๋ฆฌ ์ฝ์ ํด์ ํ๋ฉด์ ํ์๋ ๋ ์คํ์ผ์ด ์ด๋ฏธ ์ ์ฉ๋ ์ํ๋ฅผ ์ ์งํด์.
- ๋์ ์คํ์ผ ์ถ๊ฐ
- ๋ฒํผ์ ํด๋ฆญํ๋ฉด color ๊ฐ์ด ๋ฐ๋๊ณ , ์๋ก์ด ์คํ์ผ์ด ์ ์ฉ๋ฉ๋๋ค.
- ํ๋ฉด์ด ๊น๋นก์ด๊ฑฐ๋ ์คํ์ผ์ด ๋ฆ๊ฒ ์ ์ฉ๋์ง ์๋๋ก ๋ฏธ๋ฆฌ CSS๋ฅผ ์ฝ์ ํด์.
- ์ ๋ฆฌ ์์
- ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ๋๊ฑฐ๋ ์ฌ๋ผ์ง ๋ ๊ธฐ์กด์ <style> ํ๊ทธ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
๐งฉ useEffect์ useInsertionEffect์ ์ฐจ์ด์ ์?
- useEffect:
- ํ๋ฉด์ด ๋ ๋๋ง๋ ํ ์คํ๋ผ์.
- ์คํ์ผ ์ฝ์ ๊ฐ์ ์์ ์ ํ๋ฉด ์ ๊น ์คํ์ผ์ด ์ ์ฉ๋์ง ์์ ๋ชจ์ต์ด ๋ณด์ผ ์ ์์ด์.
- useInsertionEffect:
- ํ๋ฉด์ด ๊ทธ๋ ค์ง๊ธฐ ์ง์ ์ ์คํ๋ผ์.
- ์คํ์ผ์ด ๋ฏธ๋ฆฌ ์ ์ฉ๋๋ฏ๋ก ํ๋ฉด์ด ๊น๋นก์ด์ง ์์์.
๐ ์ธ์ ์ฌ์ฉํ ๊น์?
- CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ:
- ์คํ์ผ์ ๋์ ์ผ๋ก ์ฝ์ ํด์ผ ํ ๋ ์ฌ์ฉํด์.
- ์๋ฅผ ๋ค์ด, styled-components๋ emotion ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค ๋ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ๋ผ์.
- ์ฑ๋ฅ ์ต์ ํ:
- ํ๋ฉด ๊น๋นก์์ด๋ ์คํ์ผ ์ ์ฉ ์ง์ฐ์ ๋ง์์ผ ํ ๋.
๐ ์ ๋ฆฌํ์๋ฉด!
useInsertionEffect๋ ํ๋ฉด์ด ๊ทธ๋ ค์ง๊ธฐ ์ ์ ์คํ๋๋ ํน์ํ ํ
์ผ๋ก, ์ฃผ๋ก ์คํ์ผ ์ฝ์
์์
์ ์ฌ์ฉ๋ฉ๋๋ค.
์ด ๋๋ถ์ ๊น๋นก์ ์์ด ๋ถ๋๋ฝ๊ฒ ์คํ์ผ์ด ์ ์ฉ๋ผ์!
'web > react hook' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
useMemo (2) | 2024.12.14 |
---|---|
useLayoutEffect (0) | 2024.12.14 |
useImperativeHandle (0) | 2024.12.14 |
useId (0) | 2024.12.14 |
useEffect (1) | 2024.12.14 |
- Total
- Today
- Yesterday
- ์ ์ฅ์
- useinsertioneffect
- Store
- state
- experimental_taintobjectreference
- experimental_taintuniquevalue
- ๋ฒ ํ
- dns-prefetch
- react dom hook
- flushsync
- useid
- ์คํ์
- prefetchdns
- zustand
- react dom
- Props
- useRef
- ์ํ๊ด๋ฆฌ
- react
- component
- finddomnode
- useformstatus
- react hook
- usedeferredvalue
- experimental
- ์ธ๋ถํฐํธ
- Nextjs
- preconnect
- ์ต์ ๋ฐ์ดํฐ
- ๋ฐ์ดํฐ์ ์ง
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |