useId 알아보기

2024. 8. 16. 17:47·Stack/React
반응형

useId란?

useId 는 React18 에서 추가된 기능이다.

useId는 react의 고유한 Id를 만들때 사용하는 훅이다.

const id = useId();

useId로 만든 Id는 form같은 요소에서 접근성 관련으로 사용한다.

코드로 알아보기

'use client';

import { useId } from 'react';

const UseIdEx = () => {
  return (
    <div>
      <label htmlFor="name">이름</label>
      <input id="name" />
    </div>
  );
};

export default UseIdEx;

다음과 같은 코드에서 라벨에 있는 내용을 클릭하면 input값이 선택되는 코드이다.

문제가 되는 경우

'use client';

import { useId } from 'react';

const UseIdEx = () => {
  const id = useId();
  console.log(id);

  return (
    <div>
      <MyName />
      <MyName />
    </div>
  );
};

export default UseIdEx;

const MyName = () => {
  return (
    <div>
      <label htmlFor="name">이름</label>
      <input id="name" />
    </div>
  );
};

다음과 같이 컴포넌트에 id값을 부여한 경우, 동일한 컴포넌트를 불러올때 동일한 id 값이 두개가 되어 정상적으로 작동하지 않는다.

이럴때 useId를 사용한다.

useId를 통해 문제를 해결하는 방법

'use client';

import { useId } from 'react';

const UseIdEx = () => {
  return (
    <div>
      <MyName />
      <MyName />
    </div>
  );
};

export default UseIdEx;

const MyName = () => {
  const id = useId();

  return (
    <div>
      <label htmlFor={id}>이름</label>
      <input id={id} />
    </div>
  );
};

useId를 사용하게 되면 input이 각각의 고유의 id를 생성하게 된다.

useId를 효율적으로 사용하는 법

→ 컴포넌트의 label이 여러개일 경우

'use client';

import { useId } from 'react';

const UseIdEx = () => {
  return (
    <div>
      <MyName />
      {/* <MyName /> */}
    </div>
  );
};

export default UseIdEx;

const MyName = () => {
  const id = useId();

  return (
    <div>
      <label htmlFor={`${id}-name`}>이름</label>
      <input id={`${id}-name`} />
      <br />
      <label htmlFor={`${id}-age`}>나이</label>
      <input id={`${id}-age`} />
    </div>
  );
};

다음과 같이 input 값이 여러개인 경우 Id를 부여할때 useId를 여러번을 사용하는게 아닌 ${id}-??? 과 같이 빽틱을 이용해서 값을 부여 하면 useId를 한번 사용하고도 input에 각각의 고유한 값을 부여할 수 있다.

다른 라이브러리들이 있음에도 useId를 사용하는 이유

리액트를 사용할 때 querySelector를 사용하는건 좋은방법이 아니다.

리액트에는 ref 라는 좋은 기능이 있기 때문이다.

'use client';

import { useEffect, useId } from 'react';

const UseIdEx = () => {
  return (
    <div>
      <MyName />
    </div>
  );
};

export default UseIdEx;

const MyName = () => {
  const id = useId();

  useEffect(() => {
    const element = document.querySelector('#btn');
    console.log(element);
  }, []);

  return (
    <div>
      <button id="button">버튼</button>
      <label htmlFor={`${id}`}>이름</label>
      <input id={`${id}`} />
    </div>
  );
};

다음과 같이 id를 부여한다면 querySelector를 통해 button에 접근할 수 있지만

const MyName = () => {
  const id = useId();

  useEffect(() => {
    // const element = document.querySelector('#btn');
    // console.log(element);

    const element = document.querySelector(id);
    console.log(element);
  }, []);

  return (
    <div>
      <button id="button">버튼</button>
      <label htmlFor={`${id}`}>이름</label>
      <input id={`${id}`} />
    </div>
  );
};

useId를 통해 querySelector로 간다면 아래와 같은 오류가 발생한다.

SyntaxError: Failed to execute 'querySelector' on 'Document': ':R9uuucq:' is not a valid selector.

  • 만약 다른 라이브러리를 사용할경우 페이지를 렌더링할 때마다 새롭게 고유한 id를 부여하는 번거로움 생기지만 useId는 그렇지 않고 고유한 값을 유지한다. ⇒ 안정성이 높아진다.
반응형

'Stack > React' 카테고리의 다른 글

useTransition 알아보기  (0) 2024.08.16
useDefferdValue 알아보기  (0) 2024.08.16
useReducer 알아보기  (0) 2024.08.12
useLayoutEffect 에 대해 알아보기  (2) 2024.08.12
useCallback 이란?  (0) 2024.08.07
'Stack/React' 카테고리의 다른 글
  • useTransition 알아보기
  • useDefferdValue 알아보기
  • useReducer 알아보기
  • useLayoutEffect 에 대해 알아보기
WHITE_FROST
WHITE_FROST
개발공부리뷰블로그
    반응형
  • WHITE_FROST
    하얀하얀IT
    WHITE_FROST
  • 전체
    오늘
    어제
    • 분류 전체보기 (119)
      • Stack (43)
        • Next.js (7)
        • React (12)
        • React-Native (15)
        • TypeScript (0)
        • Python (2)
        • JavaScript (2)
        • Android (1)
        • DB (2)
        • JAVA (1)
      • Obsidian (1)
      • AI (3)
      • AI Tools (0)
      • Tools (0)
      • Mac (0)
      • Error (7)
      • 알고리즘 정리 (6)
      • 알고리즘 문제풀이 (46)
      • 공부일상 (4)
      • 개발 도구 & 라이브러리 (0)
      • 정보처리기사 (0)
      • 기타 (6)
      • Tip (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    React-Native cli
    java
    백준
    Next.js
    react-native
    ios
    SWEA
    Python
    오블완
    리액트네이티브
    error
    D2
    알고리즘
    프로그래머스
    reactnative
    react-native-maps
    티스토리챌린지
    ReactHook
    코테
    d1
    Expo
    React Hooks
    boj
    mongoDB Atlas
    javascript
    react
    mongodb cloud
    코테준비
    hooks
    코딩테스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
WHITE_FROST
useId 알아보기
상단으로

티스토리툴바