문제점
프로젝트 진행 중에 react-hook-form 을 쓰게 될 일이 있어서 사용했다.
특수하게 api 를 받아와서 결과 값을 도출하는 로직이어서 react-hook-form 에서 제공하는 data 를 바로 body로 넘기는 코드를 작성했다.
그런데 객체로 값을 넘겨줄때, 아래처럼 v.value 가 객체면 react-hook-form 에서 정한 value type에 어긋나기 때문에,
그 객체 자체를 전달해줄 수 없다.
따라서 JSON.stringify 로 문자열형태로 전달해주어야함
<S.RadioInput
{...register(`${v.type}`, {
required: `${v.title} 은 필수 선택 항목입니다.`,
})}
type="radio"
value={JSON.stringify(v.value)}
id={v.title.replace(/\s+/g, "-").toLowerCase()}
/>;
그런데 이상태에서 값을 전달하면 api 를 제대로 받아올 수 없기 때문에 수정 해주어야한다.
시도해본 것
다음과 같이 react-hook-form 에서 제공하는 watch 를 사용했는데, 해당하는 register 의 value 를 기억했다가
파싱 이후에 새 "alc" 라는 key 값에 집어넣어서 전달하는것이다.
이러면 전달도 잘되고 기능도 동작하는데 alcohol 이라는 기존의 문자열객체라는 쓸데없는 값이 생성되고, 이 과정을 객체를 포함한 모든 key value 에 적용해야해서 복잡했다.
const alcoholOption = watch("alcohol");
const alcoholOptionParse = JSON.parse(alcoholOption);
setValue("alc", alcoholOptionParse);
해결방안
다음처럼 onSubmit 으로 데이터를 body에 넘겨 전달할때 객체인 데이터가 있으면 파싱하고 그게 아니라면 원래값을 리턴하는 로직을 짜서 해결했다. 이렇게 하면 문자열객체값이 제대로 객체형태로 body 로 전송되고 결과가 잘 나온다.
const onSubmit = async (data: any) => {
const parsedData: { [key: string]: any } = {};
Object.keys(data).map((key) => {
try {
parsedData[key] = JSON.parse(data[key] as string);
} catch (error) {
parsedData[key] = data[key];
}
});
const response = await getCancerPrediction(parsedData);
setData(response);
};
알게된 것
코드를 짜다보면.. 비효율적인걸 알면서도 왠지모르게 그렇게 짤 때가 있다.. 그러지말고 방법을 계속 찾아보도록하자.
react-hook-form 을 이번기회에 처음 사용해보았는데, 앞으로 폼 데이터를 짤 때 유용하게 사용할 수 있을 것 같다.
유효성 검사할때 매우 간편함
'TIL' 카테고리의 다른 글
TIL 24.02.27 WebSocket 웹소켓 (0) | 2024.02.27 |
---|---|
TIL 23.01.18 react-toastify 중복 처리 (0) | 2024.01.18 |
TIL 23.09.30 기술 interview (18) (0) | 2023.09.30 |
TIL 23.09.19 기술 interview (15) (0) | 2023.09.19 |
TIL 23.09.15 Next.js deploy 에러 window is not defined (0) | 2023.09.15 |