반응형
Warning: Prop id did not match. Server: "react-select-4-live-region" Client: "react-select-3-live-region"
이 경고는 서버와 클라이언트에서 렌더링된 결과가 일치하지 않을 때 발생함
주로 서버 사이드 렌더링(SSR) 환경에서 발생하며,
클라이언트와 서버 사이에서 일관성 없는 ID가 생성될 때 발생할 수 있다.
경고의 원인
react-select
와 같은 라이브러리는 고유한 id
를 각 컴포넌트에 할당하는 경우가 있다. 이 고유한 id
는 클라이언트와 서버가 서로 다른 순서나 방식으로 할당하면 달라질 수 있다. 예를 들어, 컴포넌트가 처음 서버에서 렌더링될 때와 클라이언트에서 하이드레이션될 때 할당된 id
가 서로 다르면 이 경고가 발생한다.
기존코드
<ReactSelect
options={(existingTags ?? []).map((tag) => ({
label: tag,
value: tag,
}))}
placeholder="태그"
onChange={(e) =>
e && setTags(JSON.stringify(e.map((e) => e.value)))
}
isMulti
/>
가능한 원인과 해결 방법
동적 ID 생성
- 컴포넌트가 랜덤한
id
를 생성하거나,Math.random()
이나Date.now()
와 같은 클라이언트 환경에서만 고유하게 생성되는 값을id
로 사용할 경우, 서버와 클라이언트에서 서로 다른 값이 생성될 수 있다. - 이 문제를 해결하려면
id
를 일관되게 유지해야 하며, SSR 환경에서도 동일한id
를 사용하도록 해야 한다.
예시
import { v4 as uuidv4 } from 'uuid'; const uniqueInstanceId = uuidv4(); const uniqueInputId = uuidv4(); <ReactSelect instanceId={uniqueInstanceId} inputId={uniqueInputId} options={(existingTags ?? []).map((tag) => ({ label: tag, value: tag, }))} placeholder="태그" onChange={(e) => e && setTags(JSON.stringify(e.map((e) => e.value))) } isMulti />
- 컴포넌트가 랜덤한
react-select
의 속성 이용react-select
라이브러리가 내부적으로 고유한id
를 생성할 때, 이id
가 클라이언트와 서버에서 일관되지 않을 수 있다.react-select
에서instanceId
또는inputId
와 같은 속성을 명시적으로 설정하여 서버와 클라이언트에서 동일한id
가 사용되도록 강제할 수 있다.
예시
<ReactSelect instanceId={'tags'} options={(existingTags ?? []).map((tag) => ({ label: tag, value: tag, }))} placeholder="태그" onChange={(e) => e && setTags(JSON.stringify(e.map((e) => e.value))) } isMulti />
반응형
'Frontend > Libraries' 카테고리의 다른 글
[TailwindCSS] container width 커스텀하기 (0) | 2024.08.27 |
---|---|
OpenAI API의 입력과 출력 이해하기 (0) | 2024.08.16 |
yarn pnp에서 node-modules로 변경후 supabse CLI 사용하기... (0) | 2024.07.01 |
[Swiper] 스와이퍼 버벅대는 현상(js 중복) (0) | 2024.05.07 |
[Redux] 리덕스 라이브러리 이해하기 (1) | 2023.12.28 |