[리팩토링] React-Hook-Form 도입
2023. 9. 15. 17:51ㆍProject Tours/Tour on Plantopia
리액트 훅 폼을 사용하기 전 폼을 제출하기 위해서는 수많은 State와 Onchange 작성이 필요했다.
const [plantNickname, setPlantNickname] = useState<string>(
nicknameFromDetail || nicknameFromList,
);
const [plantName, setPlantName] = useState<string>(
plantNameFromDetail || plantNameFromList,
);
const [purchasedDay, setPurchasedDay] = useState<string>(
secondsToDate(
purchasedDayFromDetail?.seconds || purchasedDayFromList?.seconds,
),
);
const [wateredDay, setWateredDay] = useState<string>(
secondsToDate(wateredDayFromDetail?.seconds || wateredDayFromList?.seconds),
);
const [frequency, setFrequency] = useState<number>(
frequencyFromDetail || frequencyFromList,
);
const [imgUrl, setImgUrl] = useState<string>(
imgUrlFromDetail || imgUrlFromList,
);
const [previewImg, setPreviewImg] = useState<string>();
const handlePlantNickname = (e: React.ChangeEvent<HTMLInputElement>) => {
setPlantNickname(e.target.value);
};
const purchasedDayHandler = (e: React.ChangeEvent<HTMLInputElement>) => {
setPurchasedDay(e.target.value);
};
const wateredDaysHandler = (e: React.ChangeEvent<HTMLInputElement>) => {
setWateredDay(e.target.value);
};
const handleFrequency = (e: React.ChangeEvent<HTMLInputElement>) => {
setFrequency(Number(e.target.value));
};
이런 코드를 줄이고 성능 개선을 이뤄낼 수 있는 react hook form을 적용하기로 했다. 사실 이미 register페이지는 적용했고 edit 페이지를 적용해야했다.
코드를 정리하고 나니 onValid 함수로 모든 것이 처리 되었다. 다만 다시 코드를 짜면서 마지막 물 준 날에 대해서 케이스를 나누는 것이 오래걸렸다. 배열인데 값이 또 필수는 아니라서 애초에 없을 수도 있고 수정안 할 수도 있어서 생각이 필요했는데 일단 조건을 다 적어두고 라이브러리 적용만 시켰다. 꽤나 많은 코드가 제거 되었다.
const onValid = async (data: UserPlantForm) => {
setSaving(true);
let modifiedWateredDays: InstanceType<typeof Timestamp>[] = [];
if (data.wateredDays) {
if (wateredDayFromDetail || wateredDayFromList) {
modifiedWateredDays = wateredDayFromDetail
? [...wateredDayFromDetail]
: [...wateredDayFromList];
if (modifiedWateredDays.length > 0) {
modifiedWateredDays[modifiedWateredDays.length - 1] = dateToTimestamp(
data.wateredDays,
);
} else if (modifiedWateredDays.length == 0) {
modifiedWateredDays.push(dateToTimestamp(data.wateredDays));
}
}
} else {
modifiedWateredDays = wateredDayFromDetail
? [...wateredDayFromDetail]
: [...wateredDayFromList];
}
const updatedFields = {
imgUrl: imgUrl,
nickname: data.nickname,
purchasedDay: dateToTimestamp(data.purchasedDay),
wateredDays: modifiedWateredDays,
frequency: data.frequency,
};
if (!docId) return;
updatePlantData(docId, updatedFields);
navigate('/myplant');
};
'Project Tours > Tour on Plantopia' 카테고리의 다른 글
[오늘의 이슈] 물준 날 미설정 시 undefined 값에 초기값 주기 (0) | 2023.09.18 |
---|---|
[오늘의 이슈] 삭제 기능 버그 픽스 (0) | 2023.09.18 |
[리팩토링] 왜 식물 리스트 최신화가 안 이루어지는가? (0) | 2023.09.15 |
[리팩토링] 파이어베이스 서비스 코드 분리 (0) | 2023.09.15 |
렌더링 후 undefined가 먼저 들어가서 수정 데이터 초기값을 못잡는 경우 (0) | 2023.08.27 |