๐ React์์ useId๋ ๋ฌด์์ธ๊ฐ?
Source: Dev.to
useId๋ React(๋ฒ์ โฏ18๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅ)์์ ์ ๊ณตํ๋ Hook์ผ๋ก, ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ณ ์ ํ๊ณ ์์ ์ ์ธ ์๋ณ์๋ฅผ ์์ฑํฉ๋๋ค. ์ด Hook์ ํด๋น ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ๋ํด ์ ์ผํ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
useId๋ ๋ฌด์์ ์ํด ์ฌ์ฉํ๋์?
์์ ์ฐ๊ฒฐ (์ ๊ทผ์ฑ)
๊ฐ์ฅ ํํ ์ฌ์ฉ ์ฌ๋ก๋ <label>์ ํผ ํ๋( <input> )์ ์ฐ๊ฒฐํ๋ ๊ฒ์
๋๋ค. HTML์์๋ label์ htmlFor ์์ฑ์ด input์ id ์์ฑ๊ณผ ๋์ผํด์ผ ํฉ๋๋ค. ID๋ฅผ ์๋์ผ๋ก ์ฝ๋ฉํ๊ณ ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ ๋๋งํ๋ฉด ์ค๋ณต๋ ID๊ฐ ๋ฐ์ํด HTML์ด ๋ฌดํจํ๋๊ณ ์คํฌ๋ฆฐ ๋ฆฌ๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ์ง ์์ ์ ์์ต๋๋ค.
useId๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ์ ๊ฐ ์ธ์คํด์ค๊ฐ ์๋ก ๋ค๋ฅธ ID๋ฅผ ๋ฐ์, label๊ณผ input ์ฌ์ด์ ์ฌ๋ฐ๋ฅธ ์ฐ๊ฒฐ์ ๋ณด์ฅํฉ๋๋ค.
import { useId } from 'react';
function PasswordField() {
// ์ด ์ธ์คํด์ค๋ฅผ ์ํ ๊ณ ์ ํ๊ณ ์์ ์ ์ธ ID ์์ฑ
const passwordId = useId();
return (
<>
Senha:
{/* ID ์ฌ์ฉ ์์ */}
<label htmlFor={passwordId}>Senha</label>
<input id={passwordId} type="password" />
</>
);
}
ServerโSide Rendering(SSR) ํธํ์ฑ
useId๋ ์๋ฒ์์ ์ต์ด ๋ ๋๋ง๋ ๋ ์์ฑ๋ ID์ ํด๋ผ์ด์ธํธ์์์ ํ์ ๋ ๋๋ง(ํ์ด๋๋ ์ด์
) ์ ์์ฑ๋ ID๊ฐ ๋์ผํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๋ฌด์์ ๋๋ ๋น๊ฒฐ์ ์ ์ผ๋ก ์์ฑ๋ ID๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ๋ถ์ผ์น๋ฅผ ๋ฐฉ์งํ๊ณ , ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ HTML ์ผ๊ด์ฑ์ ์ ์งํฉ๋๋ค.
๊ธฐํ ARIA ์์ฑ
์ด Hook์ ๋ค์๊ณผ ๊ฐ์ ARIA ์ ๊ทผ์ฑ ์์ฑ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
aria-labelledbyaria-describedby
์ธ์ useId๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ ๊น?
- ๋ฆฌ์คํธ ํค ์์ฑ: ๋ฆฌ์คํธ(
.map())์key๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ID์ ๊ฐ์ด ์์ ์ ์ธ ๊ฐ์ ๊ธฐ๋ฐํด์ผ ํฉ๋๋ค.useId๋ ๋ฆฌ์คํธ ์์๊ฐ ๋ฐ๋ ๋ ์์ ์ฑ์ ๋ณด์ฅํ์ง ์์ผ๋ฏ๋ก ์ํ ๋ฒ๊ทธ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. - ์ ์ญ์ ์ผ๋ก ๊ณ ์ ํ ID(UUID) ์์ฑ:
useId๊ฐ React ํธ๋ฆฌ ๋ด์์๋ ๊ณ ์ ํ์ง๋ง, ๊ทธ ํ์์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ ์ผ๊ด์ฑ์ ์ํด ๊ฒฐ์ ๋ก ์ ์ ๋๋ค. ๋ฐ๋ผ์ ๋ฌด์์ UUID์ ๊ฐ์ ์ ์ญ ๊ณ ์ ์๋ณ์๋ก ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค.