컴포넌트 내 드롭다운 필터를 초기화(reset) 해야 하는 상황이 있었습니다.
처음에는 아래와 같은 방식으로 리셋을 구현했었어요.
const [isReset, setIsReset] = useState(false);
const handleReset = () => {
setKeyword("");
setPage(1);
setTarget(All);
setIsReset(true);
setTimeout(() => setIsReset(false), 1000);
};
<AdminDropdown
isReset={isReset}
/>
setTimeout으로 리셋 flag를 1초 뒤에 false로 만드는 게 불안정하고 지저분했음Dropdown 컴포넌트 내부에서 isReset을 감지해 setLabel, onValueChange 등을 직접 호출해야 했음Dropdown 외부에서도 내부에서도 분산되어 있어 관리가 어려워짐isReset 대신 key 값을 증가시키는 방식으로 리팩터링
const [resetKey, setResetKey] = useState(0);
const handleReset = () => {
setPage(1);
setTarget(All);
setGender(All);
setAgeGroup(All);
setKeyword("");
setResetKey(prev => prev + 1);
};
return (
<div>
<AdminDropdown
key={`target-${resetKey}`}
defaultLabel="전체"
dropdownMenus={filterTargetsDropdownMenus}
onValueChange={handleValueChange}
/>
<AdminDropdown
key={`gender-${resetKey}`}
defaultLabel="성별"
dropdownMenus={filterGendersDropdownMenus}
onValueChange={handleValueChange}
/>
<AdminDropdown
key={`age-${resetKey}`}
defaultLabel="연령"
dropdownMenus={filterAgeGroupsDropdownMenus}
onValueChange={handleValueChange}
/>
</div>
);
key 변경은 리액트가 해당 컴포넌트를 완전히 언마운트 → 리마운트하게 만듭니다.Dropdown 내부 상태 (useState, useEffect 등)가 자연스럽게 초기화됩니다.React의 key를 단순한 리스트 렌더링 구분용이 아니라 "리셋 트리거" 로 사용하는 것도 좋은 것 같습니다!
상태 초기화나 UI 리셋이 필요한 상황에서 적극적으로 고려할 수 있는 방법이라는 걸 새삼 느꼈습니다.