Select 컴포넌트 사용시 placeholder가 초기화되지 않는 문제 -> 키 설정하기
두 개의 select box가 있다.
채널 선택항목은 팀 항목에 종속적이다.
즉, 팀 선택 후에 -> 채널 선택 하는 방식
다시 말해,
팀 선택시, 선택지들은 API로 호출하여 선택 옵션을 불러오고,
채널 선택시, 채널 선택지들 또한 '팀 선택' 항목에서 지정한 값에 따라 동적으로 목록을 불러오는 방식인 것이다.
문제상황
내가 원했던 것은 1회차 선택에서 팀 -> 채널 선택을 한 번 마친 뒤
만약, 사용자가 팀 옵션을 바꾸면
채널 선택 항목도 초기화가 되면서
채널의 placeholder 항목이 "채널을 선택해주세요" 라는 표기로 초기화가 되길 바랐다.
그런데 placeholder 항목이 초기화가 되지 않고, 표기가 비어있었다.
문제파악 및 해결 --> React 컴포넌트에서 Key 개념의 부재
이것은 value에 대한 key를 제대로 지정하지 않아서 생긴 문제이다.
팀 선택지를 열 때마다 ( onOpenChange ) (--> shadcn/ ui의 select box 사용시에 있는 옵션인듯)
해당 key 값을 사용자가 value를 선택하는 시점의 시간을 기록하여 유니크하게 할당되도록 설정했다.
그래서 사용자가 한 번 팀 선택, 채널 선택을 마친 뒤
다시 팀 선택을 하기기로 하면 onOpenChange 에 대하여 함수가 작동하여 useState의 Set 함수로 채널 항목의 key가 변경되게 만들었다.
setChannelKey(+new Date());
{/* 셀렉트 */}
<div className="flex flex-col py-20 gap-10">
<div className="flex flex-col w-40">
<button
onClick={fetchTeamsDriveList}
disabled={isFetchDisabled}
className="bg-blue-500 text-white p-2 rounded disabled:bg-gray-500 disabled:text-gray-300 disabled:cursor-not-allowed"
>
{!isFetchDisabled ? "팀 목록 조회" : "로딩중..."}
</button>
</div>
<div>
<Select
disabled={isTeamDisabled}
onValueChange={(teamId) => {
handleTeamChange(teamId);
setSelectedChannel(null);
}}
onOpenChange={() => { // 팀 항목 선택지를 열 때마다
setChannelKey(+new Date()); // setChannelKey 함수로 channelKey 변수에 새로운 키 지정
}}
>
<SelectTrigger className="w-[180px]">
<SelectValue placeholder="팀을 선택해주세요" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>
{teamslist[0] ? "팀 목록" : "로딩중..."}
</SelectLabel>
{teamslist.map((team: any) => (
<SelectItem key={team.id} value={team.id}>
{team.displayName}
</SelectItem>
))}
</SelectGroup>
</SelectContent>
</Select>
</div>
<div>
<Select
disabled={isChannelDisabled}
onValueChange={handleChannelChange}
key={channelKey} // 채널 항목의 key
>
<SelectTrigger className="w-[180px]">
<SelectValue placeholder="채널을 선택해주세요" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>
{channelFolderList ? "채널 목록" : "로딩중..."}
</SelectLabel>
{channelFolderList.map((channelFolder: any) => (
<SelectItem key={channelFolder.id} value={channelFolder.id}>
{channelFolder.displayName === "General"
? "일반"
: channelFolder.displayName}
</SelectItem>
))}
</SelectGroup>
</SelectContent>
</Select>
</div>
</div>
<select> – React
The library for web and native user interfaces
ko.react.dev
https://ko.react.dev/learn/rendering-lists#keeping-list-items-in-order-with-key
리스트 렌더링 – React
The library for web and native user interfaces
ko.react.dev
How can i reset a Select field? · shadcn-ui/ui · Discussion #638 (github.com)
How can i reset a Select field? · shadcn-ui ui · Discussion #638
I currently have: const formRef = useRef<HTMLFormElement>(null) const { toast } = useToast() async function action(data: FormData) { console.log('working...') formRef?.current?.reset() } <form acti...
github.com
리액트에서 폼 요소의 기본값 설정하기 - value와 defaultValue (velog.io)
리액트에서 폼 요소의 기본값 설정하기 - value와 defaultValue
값이 선택되면 변경되질 않고, 변경되는 값이면 기본값이 선택 안되는 문제 🤔
velog.io
'개발 학습일지(TIL)' 카테고리의 다른 글
ElasticSearch, ELK 스택의 AGPL 3.0 라이선스 이슈 정리 (0) | 2025.01.10 |
---|---|
[카프카, 주키퍼] apache Kafka 설치 및 실행 방법 정리(윈도우11, Nestjs) (0) | 2024.05.22 |
nextjs / swagger-ui-react / Node.js 버전 호환 에러 : Class extends... (1) | 2024.03.15 |
AWS S3 - CloudFront 빠른 설정 방법 (+access denied 해결) (0) | 2024.02.13 |
vs code 내 터미널에서 한글 입력 시 씹힘(?) 발생 오류 (0) | 2024.02.02 |
댓글