[React] ๋ ธ๋์ ํธ๋ฆฌ ์์น๋ฅผ ๋ํ๋ด๋ useId ํ
useId ์๊ฐ
useId()
๋ React 18 ๋ฒ์ ์ ๋์
๋ ํ
์ผ๋ก, ๋
ธ๋์ ํธ๋ฆฌ ์์น๋ฅผ ๋ํ๋ด๋ ๊ณ ์ ID(Base32 ๋ฌธ์์ด)๋ฅผ ๋ฐํํ๋ค. ์ปดํฌ๋ํธ ํธ๋ฆฌ๊ฐ ์ฌ๋ฌ ์์(children)์ผ๋ก ๋ถ๊ธฐ๋ ๋๋ง๋ค ID์ ์ถ๊ฐ ๋นํธ๋ฅผ ์ฝ์
ํด์ ๊ฐ ์์์ ์์น๋ฅผ ๋ํ๋ธ๋ค.
:r0: (๋ถ๋ชจ ์ปดํฌ๋ํธ)
:r1: (์์ ์ปดํฌ๋ํธ1)
:r2: (์์ ์ปดํฌ๋ํธ2)
...
์ฃผ๋ก ์๋ฒ / ํด๋ผ์ด์ธํธ์์ ์์ฑํ ํธ๋ฆฌ(tree) ์ฌ์ด์ ํ์ด๋๋ ์ด์
(hydration) ๋ถ์ผ์น(mismatch)๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์ฆ, useId
๊ฐ ์์ฑํ ๊ณ ์ ํ ID๋ฅผ ์ด์ฉํด ์ํํ ํ์ด๋๋ ์ด์
์ ๋๋ ๋ชฉ์ ์ธ ๊ฒ. ๋ฆฌ์คํธ์ key
๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๋ชฉ์ ์ด ์๋๋ฏ๋ก ์ฃผ์ํ๋ค.
์ถ๋ ฅ๊ฐ ์์
๐ก :
(์ฝ๋ก )์ querySelector
๊ฐ์ CSS ์
๋ ํฐ์์ ์ง์ํ์ง ์๋๋ค(\
๋ฐฑ์ฌ๋์๋ก ์ด์ค์ผ์ดํํด์ ์ฌ์ฉํ ์๋ ์๋ค). useId
๋ :
ํ ํฐ์ ํฌํจํ ๋ฌธ์์ด์ ์์ฑํ๋ฏ๋ก CSS ์
๋ ํฐ์์ ์ฌ์ฉํ ์ ์๋ค.
// App.js
function App() {
const id = useId();
return (
<div>
<h3>{`App - ${id}`}</h3> {/* App - :r0: */}
<Child /> {/* Child - :r1: SubChild - :r2: */}
<Child /> {/* Child - :r3: SubChild - :r4: */}
</div>
);
}
// Child.js
function Child() {
const id = useId();
return (
<div>
<h3>{`Child - ${id}`}</h3>
<SubChild />
</div>
);
}
// SubChild.js
export default function SubChild() {
const id = useId();
return <h3>{`SubChild - ${id}`}</h3>;
}
ํ๋ฉด ์ถ๋ ฅ ๊ฒฐ๊ณผ โผ
App - :r0:
Child - :r1:
SubChild - :r2:
Child - :r3:
SubChild - :r4:
์ฐธ๊ณ ๋ก ๋์ผ ์ปดํฌ๋ํธ์์ useId
ํ
์ ์ฌ๋ฌ๋ฒ ํธ์ถํ๋ฉด ๊ฐ๊ฐ ๋ค๋ฅธ ID๋ฅผ ์์ฑํ๋ค.
// App.js
const id1 = useId();
const id2 = useId();
console.log(id1, id2); // :r0: :r1:
ํ์ฉ ์์
<label>
โ <input>
์์๋ฅผ ์ฐ๊ฒฐํ ๋ useId
ํ
์ด ์์ฑํ ์ ๋ํฌ ID
๋ฅผ ํ์ฉํ ์ ์๋ค.
// Basic Example via React ๊ณต์ ๋ฌธ์
function Checkbox() {
const id = useId();
return (
<>
<label htmlFor={id}>Do you like React?</label>
<input id={id} type="checkbox" name="react" />
</>
);
}
์ฌ๋ฌ ํ๋์ ์ฌ์ฉํ ๋ ์ ๋ํฌ ID + ์ ๋ฏธ์ฌ
๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์๋ ์๋ค.
// Multiple Fields Example via React ๊ณต์ ๋ฌธ์
function NameFields() {
const id = useId();
return (
<div>
<label htmlFor={id + '-firstName'}>First Name</label>
<div>
<input id={id + '-firstName'} type="text" />
</div>
<label htmlFor={id + '-lastName'}>Last Name</label>
<div>
<input id={id + '-lastName'} type="text" />
</div>
</div>
);
}
์ฐธ๊ณ ๊ธ
- https://github.com/facebook/react/pull/22644
- Hooks API Reference - React
- React 18 ๋ฏธ๋ฆฌ๋ณด๊ธฐ
- ๋ฆฌ์กํธ v18 ๋ฒ์ ํบ์๋ณด๊ธฐ
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[JS] ์ธ๋ผ์ธ ์คํ์ผ ์ ์ - cssText
[JS] ์ธ๋ผ์ธ ์คํ์ผ ์ ์ - cssText
2024.05.13 -
[React] ์บ๋ก์ (Carousel) ์๋ ๋ฐฉ์ ์ดํด๋ณด๊ธฐ
[React] ์บ๋ก์ (Carousel) ์๋ ๋ฐฉ์ ์ดํด๋ณด๊ธฐ
2024.05.13 -
[TS] ์๋ฆฌ๋จผํธ์ ๊ธฐ๋ณธ ์ดํธ๋ฆฌ๋ทฐํธ ์ธํฐํ์ด์ค/ํ์ ์ฌ์ฉํ๊ธฐ
[TS] ์๋ฆฌ๋จผํธ์ ๊ธฐ๋ณธ ์ดํธ๋ฆฌ๋ทฐํธ ์ธํฐํ์ด์ค/ํ์ ์ฌ์ฉํ๊ธฐ
2024.05.12 -
[JS] ์ JSX ์์์ if ๋ฌธ์ ์ฌ์ฉํ ์ ์์๊น? ํํ์๊ณผ ๋ฌธ ์ฐจ์ด์
[JS] ์ JSX ์์์ if ๋ฌธ์ ์ฌ์ฉํ ์ ์์๊น? ํํ์๊ณผ ๋ฌธ ์ฐจ์ด์
2024.05.12