14.1 useId๋?14.1.1 useId ๊ฐ๋
๊ณผ ๊ธฐ๋ณธ๊ตฌ์กฐ14.1.2 useId๋ฅผ ์ฌ์ฉํ๋ ์ด์ 14.1.3. useId ์ฌ์ฉ ์ ์ฃผ์ํ ์ 14.2 useId ์ค์ฉ ์์ 14.2.1. useId ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ14.2.2 (์ค์ต 1) ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ ์ ๋ค๋ฅธ ์์ด๋ ์์ฑํ๊ธฐ14.2.3 (์ค์ต 2) ํ ์ปดํฌ๋ํธ ๋ด์์ ๋ค๋ฅธ ์์ด๋ ์์ฑํ๊ธฐ
14.1 useId๋?
14.1.1 useId ๊ฐ๋ ๊ณผ ๊ธฐ๋ณธ๊ตฌ์กฐ
ย
useId๋ ๋ธ๋ผ์ฐ์ ์์ ๋ ๋๋งํ ๋ ์์ ์ ์ผ๋ก ๊ณ ์ ํ ID๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ฉ๋๋ก์จ React์ ๋ด์ฅ๋ Hook์
๋๋ค. HTML์์ ID๋ style sheet์์ ํน์ style ์ ์ธ์ ๊ฐ๋ฆฌํค๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, JavaScript์์ ํน์ ID๋ฅผ ๊ฐ์ง ์์์ ์ ๊ทผํ๊ณ ์กฐ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. React์์๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ์์ ๋ชจ๋ ์ํธ์์ฉํ ์ ์๋ HTML๋ก ๋ ๋๋งํ๊ณ ์๊ธฐ ๋๋ฌธ์, React ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ID๋ฅผ HTML๋ก ์ฐ๊ฒฐํ์ฌ ๋์ผํ๊ฒ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
React์์ useId๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ค์ ์ฝ๋์ฒ๋ผ Hook์ ๊ฐ์ ธ์ค๊ณ , ์ฌ์ฉํ ๊ฐ์ ์ ์ธํ๊ฒ ๋ฉ๋๋ค.
ย
import { useId } from "react";
ย
const id = useId();
ย
14.1.2 useId๋ฅผ ์ฌ์ฉํ๋ ์ด์
ย
useId๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ useId๋ฅผ ํตํด ์ฝ๊ฒ ๊ฒฌ๊ณ ํ ID๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ํ useId๋ : ํ ํฐ์ ํฌํจํ๋ ๋ฌธ์์ด์ ์์ฑํ์ฌ ๋ค์ ID์ ํน์ง์ ๋ณด์ฅํ๊ณ ์์ต๋๋ค.
ย
- ํ ํ์ด์ง์์ ํ๋์ ๊ณ ์ ํ ID๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ง์ฝ ํ ๋ฌธ์ ์์ ๋์ผํ ID ๊ฐ์ ํฌํจํ๋ค๋ฉด, ์ฌ์ฉ์๊ฐ ์ํ๋ ๋ฐฉ์๋๋ก ์์๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ๋ฉ๋๋ค. useId๋ฅผ ์ฌ์ฉํ๋ค๋ฉด React์์ ์์ฑํ ID๋ฅผ ๊ณ ์ ํ๊ฒ ๊ฐ์ง ์ ์๋๋ก ์ค์ ํ๊ฒ ๋ฉ๋๋ค.
- ID๋ ID๋ฅผ ํตํด ์ฌ๋์ด ์ฝ์ ์ ์๋ ์ ๋ณด๋ฅผ ๋๋ฌ๋ด์ง ์๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ์ด๋ ๋ณด์๊ณผ ๊ด๋ จํ์ฌ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. useId๋ก ID๋ฅผ ์์ฑํ๋ค๋ฉด ํด๋น ID ์์์ ์ ๋ณด์๋ ๊ด๋ จ ์์ด ์์ฑํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ณด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
- useId๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋๋๋ง๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ณํ์๋ ์ผ๊ด์ฑ ์๊ฒ ID์ ๊ฐ์ ์ ์งํ ์ ์์ต๋๋ค.
ย
14.1.3. useId ์ฌ์ฉ ์ ์ฃผ์ํ ์
useId๋ฅผ ์ฌ์ฉํ ๋ ๋ช ๊ฐ์ง ์ฃผ์ํด์ผํ ์ํฉ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ย
- useId๋ ๋ฃจํ ํน์ ์กฐ๊ฑด ๋ด์์ ํธ์ถ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. useId๋ Hook์ด๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ์ ์ต์์ ์์์์๋ง ํธ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์์ฑ๋ ID๋ CSS ์ ํ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. useId๋ฅผ ์ด์ฉํด ID๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ๋ฌธ์์ด์ ๋ฐํํ์ง๋ง
:r1:
,:r2:
์ฒ๋ผ ์ฝ๋ก ์ ํฌํจํ๋ ๊ฐ์ ID๋ก ์์ฑํด ์ค๋๋ค. CSS ์ ํ์์์ ํน์๋ฌธ์๋ฅผ ํฌํจํ๋ ๋ฌธ์์ด์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ CSS ์ ํ์๋ก ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ํ์ง๋ง ์ด๋ฐ ๊ฒฝ์ฐ, useId๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ์์์ ์ ๊ทผํ ์๋ ์์ง๋ง useRef๋ฅผ ์ฌ์ฉํ๊ฒ๋๋ฉด ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋งค๋ฒ ๊ณ ์ ID๋ฅผ ์์ฑํด ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝํด์๋ ์ ๋๋ ๊ฐ์๋ ์ฌ์ฉํ์ง ์์์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ชฉ๋ก์ key๊ฐ์ ์์ฑํ๋ ๋ฐ์๋ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
ย
14.2 useId ์ค์ฉ ์์
useId๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ๊ณ ์ ์ ID๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ฒ ์ฑํฐ์์๋ useId๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ ์์ ๋ฅผ ํตํด ์์๋ณด๊ฒ ์ต๋๋ค.
14.2.1. useId ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
ย
App.jsx๋ useId๋ก ์ฒดํฌ๋ฐ์ค์ ID๋ฅผ ๋ถ์ฌํ๊ณ , Child ๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ฝ๋์
๋๋ค.
ย
import React, { useId } from 'react'; import Child from './Child'; function App() { const id = useId(); return ( <> <label htmlFor={id}>App check</label> <input type="checkbox" id={id} /> <Child /> <Child /> <Child /> </> ); } export default App;
ย
Child ์ปดํฌ๋ํธ ๋ํ ์์ ๊ฐ์ด ์ฒดํฌ๋ฐ์ค์ useId๋ฅผ ์ด์ฉํ์ฌ ์์ด๋๋ฅผ ๋ถ์ฌํ๋ ์ฝ๋์
๋๋ค.
import React, { useId } from 'react'; function Child() { const id = useId(); return ( <> <br /> // ์ค๋ฐ๊ฟ ์ํ ์ฝ๋ <label htmlFor={id}>Child Check</label> <input type="checkbox" id={id} /> </> ); } export default Child;
ย
ย
ํด๋น ์ฝ๋๋ค์ ID๊ฐ์ ํ์ธํ๊ธฐ ์ํด ๊ฐ๋ฐ์๋๊ตฌ๋ฅผ ํ์ธํ๋ฉด, ๊ฐ์ Child ์ปดํฌ๋ํธ์ ์ฝ๋์ด์ง๋ง ์ด๋ ๊ฒ ๊ฐ๊ฐ ๋ค๋ฅธ ID๊ฐ์ด ์์ฑ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด์ฒ๋ผ useId๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ์ ํ์ด์ง์ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฌ๋ฒ ๋ ๋๋ง ๋๋๋ผ๋ ์ผ์ผ์ด ๋ค๋ฅธ ID๋ฅผ ์ง์ ๋ฃ์ง ์๊ณ ํธ๋ฆฌํ๊ฒ ๊ณ ์ ํ ID๊ฐ์ ๋ถ์ฌํ ์ ์์ต๋๋ค.
ย
14.2.2 (์ค์ต 1) ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ ์ ๋ค๋ฅธ ์์ด๋ ์์ฑํ๊ธฐ
useId๋ input ์์์ label์ ์ฐ๊ฒฐํ๋ ๋ฑ HTML ์์๋ฅผ ์ฐ๊ฒฐํ ๋ useId๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ย
function NameForm() { return ( <> <label htmlFor="name">์ด๋ฆ</label> <input id="name" type="text" /> </> ); } function App() { return ( <> <NameForm /> <NameForm /> <NameForm /> </> ); } export default App;
ย
ย
์์ ์ฝ๋๋ ๋ฌธ์ ์์ด ์ ์๋ํฉ๋๋ค. ํ์ง๋ง ๊ฐ์ ํ์ด์ง์์ ์์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ ๋๋งํ๋ ๊ฒฝ์ฐ ๋์ผํ ID๋ฅผ ๊ฐ์ง ์ฌ๋ฌ ๊ฐ์ ์
๋ ฅ ์์๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ํ์ด์ง์ ๋ชจ๋ ID๋ ๊ณ ์ ํ ID๋ฅผ ๊ฐ์ ธ์ผ ํ๋ฉฐ, 3๋ฒ์งธ input์ label์ ํด๋ฆญํ๋๋ผ๋ ํด๋น label๊ณผ ์ฐ๊ฒฐ๋ input ์์ ๋์ ์ฒซ ๋ฒ์งธ input ์์์ focus๊ฐ ๋ง์ถฐ์ง๊ธฐ ๋๋ฌธ์ ์ข์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ ์๋ ์์ต๋๋ค. ์ด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด useId๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ย
import { useId } from 'react' function NameForm() { const id = useId(); return ( <> <label htmlFor={id}>์ด๋ฆ</label> <input id={id} type="text" /> </> ); } function App() { return ( <> <NameForm /> <NameForm /> <NameForm /> </> ); } export default App;
ย
ย
์ด์ฒ๋ผ useId๋ฅผ ํตํด ID๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ๊ฐ์ ํ์ด์ง์์ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฌ ๋ฒ ๋ ๋๋ง ๋๋๋ผ๋ ๊ณ ์ ํ ID ๊ฐ์ ๊ฐ์ง๊ฒ ๋๊ธฐ ๋๋ฌธ์ ์ค๋ณต ID์ ๋ํ ๊ฑฑ์ ์์ด ์ํ๋ ๋งํผ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง ํ ์ ์์ต๋๋ค.
14.2.3 (์ค์ต 2) ํ ์ปดํฌ๋ํธ ๋ด์์ ๋ค๋ฅธ ์์ด๋ ์์ฑํ๊ธฐ
ย
import { useId } from 'react' function App() { const id = useId(); return ( <div> <label htmlFor={id + '-nickname'}> ๋๋ค์ </label> <div> <input id={id + '-nickname'} type="text" /> </div> <label htmlFor={id + '-password'}> ๋น๋ฐ๋ฒํธ </label> <div> <input id={id + '-password'} type="password" /> </div> </div> ); } export default App;
์ ์์ ์์ ๋ณด์๋ ๊ฒ๊ณผ ๊ฐ์ด useId๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ญ์ ์ผ๋ก ์๋ฒ์ ํด๋ผ์ด์ธํธ ๋ชจ๋ ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์๋ ID๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ n๊ฐ์ ์๋ก ๋ค๋ฅธ ID๋ฅผ ๋ง๋ค๊ธฐ ์ํด useId๋ฅผ ์ฌ๋ฌ๋ฒ ์ฌ์ฉํ์ฌ ์์ฑํ๋ ๋์ ํ๋์ useId๋ฅผ ๋ง๋ค์ด ๊ณ ์ ํ ๋์ ์ธ ID๋ฅผ ๋ง๋ค๊ณ ์ ๋ฏธ์ฌ๋ฅผ ๋ถ์ฌ ์๋ก ๋ค๋ฅธ ์์ด๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
ํ์ฌ ์์ ์์ ๋๋ค์๊ณผ ๋น๋ฐ๋ฒํธ ๋ ๊ฐ์ ์
๋ ฅ์ฐฝ์ ๋ง๋ค๊ธฐ ์ํด๋ ๊ฐ๊ฐ ๋ค๋ฅธ ID๊ฐ ํ์ํฉ๋๋ค. ์ด๋ useId๋ฅผ ์ฌ์ฉํ์ฌ id๋ผ๋ ๋ณ์๋ฅผ ๋ง๋ค๊ณ โ-nicknameโ๊ณผ โ-passwordโ๋ผ๋ ์ ๋ฏธ์ฌ๋ฅผ ๋ถ์ฌ ์๋ก ๋ค๋ฅธ ID๋ฅผ ์์ฑํ์ต๋๋ค.
ย
ย
์ ์์ ๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ ๋๋ง๋ฉ๋๋ค.
id + '-nickname'
์ :r0: -nickname
์ผ๋ก ๋ ๋๋ง๋๊ณ id + '-password'
๋ :r0: -password
๋ก ๋ ๋๋ง๋์์ต๋๋ค. ์ด์ฒ๋ผ ๊ฐ์ useId๋ก ์์ฑํ ID๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์ ๋ฏธ์ฌ๋ฅผ ๋ถ์ด๋ฉด ์๋ก ๋ค๋ฅธ ID๋ก ์์ฑ๋๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.ย