๊ทธ๋ฃน ์ ๋ณด๋ฅผ ์์ ํ์ ๋ ๊ทธ๋ฃน ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์ฟผ๋ฆฌ ํค๋ฅผ ๋ฌดํจํํด์ ์๋ก์ด ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ์๋๋ฐ React-Hook-Form์
defaultValues๋ ๋ณํ์ง ์๋ ์ํฉ์ด๋ค.
1. ๊ทธ๋ฃน ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ ํผ์ defaultValues๋ก ์ค์ ํ๋ค.
export default function GroupForm({ groupInfo }: GroupFormProps) {
const {
register,
handleSubmit,
control,
formState: { errors, isValid, isDirty },
} = useForm({
mode: "all",
defaultValues: { crewName: groupInfo.crewName, labelColor: groupInfo.labelColor },
resolver: zodResolver(createGroupSchema),
});
}
2. ํผ์ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํด์ ๋ณ๊ฒฝ์ฌํญ์ด ์๊ธฐ๋ฉด ๋ฒํผ์ disable์ ํด์ ํ๋ค.
isDirty: boolean - ํผ์ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํด์ ์ด๊ธฐ ๊ฐ๊ณผ ๋ค๋ฅด๋ฉด true๋ฅผ ๋ฐํํ๋ค.dirtyFields: object - ํน์ ํ๋์ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํด์ object์ true๋ก ๊ฐฑ์ ๋๋ค.age, name์ด๋ผ๋ ํ๋๊ฐ ์๊ณ ์๋ฌด ๋ณ๊ฒฝ์ฌํญ์ด ์์ผ๋ฉด dirtyFields์๋ ๋น ๊ฐ์ฒด{}๊ฐ ๋ฐํ๋๋ค. ๋ง์ฝ age๋ฅผ ๋ณ๊ฒฝํ๋ฉด { age: true } ์ด๋ฐ ์์ผ๋ก ํน์ ํ๋์ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํ๋ค.<button type="submit" disabled={!isValid || !isDirty}>์ ์ฅํ๊ธฐ</button>
3. ๊ทธ๋ฃน ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๊ทธ๋ฃน ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์ฟผ๋ฆฌ ํค๋ฅผ ๋ฌดํจํํ๋ค.
export const useEditGroupInfo = (crewId: number) => {
const queryClient = useQueryClient();
const { mutate } = useMutation({
mutationFn: (data: CreateGroupDataType) => editGroupInfo(crewId, data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: groupKey.detail(crewId) }); // ์ฟผ๋ฆฌํค ๋ฌดํจํ
queryClient.invalidateQueries({ queryKey: groupKey.lists() });
},
});
return { mutate };
};

์์์ ๋ณด๋ฉด ์ ๊ณผ์ ์๋ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ๋๋ props๋ก ๋ฐ๋ groupInfo๊ฐ ๋ณํ๊ธฐ ๋๋ฌธ์ form์ defaultValues๋ ๋ณ๊ฒฝ๋๋ ์ค ์์๋๋ฐ defaultValues์ ๊ฐ์ ๊ทธ๋ฃน ์ ๋ณด๋ฅผ ๋ฐ๊พธ๊ธฐ ์ด์ ์ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
"
defaultValues๊ฐ ์๋ฐ๋์์ ๋ ๋ฌธ์ ๊ฐ ๋๋๊ฒ ์๋์?" ๋ผ๊ณ ์๊ฐ ํ ์ ์๋๋ฐisDirty๊ฐdefaultValues์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ๋ฒํผ์ดdisable๋ก ์ค์ ๋๋ ๋ฌธ์ ๊ฐ ์๋ค.
defaultValues: { groupName: "๋ถ๋ฆฌ๋ถ๋ฆฌ" }defaultValues: { groupName: "๋ถ๋ฆฌ๋ถ๋ฆฌ" }defaultValues๊ฐ ๋ณํ์ง ์์ ๋ค์ ๊ทธ๋ฃน ๋ช
์ ํ
์คํธ๋ก ๋ฐ๊พธ๋ ค๊ณ ํ๋ฉด isDirty ์ต์
๋๋ฌธ์ ๋ฒํผ์ด disable ์ํ๋ก ๋์ด์์ด ๋ณ๊ฒฝํ ์ ์๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค.๐ก React-Hook-Form์ ๊ณต์๋ฌธ์๋ฅผ ์ฐพ์๋ณด๋๊น defaultValues๋ ์บ์๊ฐ ๋์ด ์ฌ์ค์ ์ ํ๋ ค๋ฉด reset api๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ๋์์๋ค!

1. next/router์ reload ์ฌ์ฉํ๊ธฐ
์๋ก๊ณ ์นจ์ด ์๊ฒจ ๊ทธ๋ ๊ฒ ์ข์ ๋ฐฉ๋ฒ์ ์๋์ง๋ง ํน์๋ผ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ชป์ฐพ์ผ๋ฉด ์ตํ์ ์๋จ์ผ๋ก ์ฌ์ฉํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ ํ๋ค...
2. ๊ณต์๋ฌธ์์์ ๊ถ์ฅํ๋ reset api ์ฌ์ฉํ๊ธฐ
- reset api๋?
ํผ์ ์ ์ฒด ๊ฐ, ํน์ ๊ฐ๋ณ ํ๋์ ๊ฐ์ ์ฌ์ค์ ํ ์ ์๋ api์ด๋ค.
react-hook-form reset api ๊ณต์ ๋ฌธ์
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์๋ก๊ณ ์นจ์์ด groupInfo๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค React-Hook-Form์ defaultValues๋ฅผ ์ต์ ํํ ์ ์๋ค!
const {
register,
handleSubmit,
reset,
control,
formState: { errors, isValid, isDirty },
} = useForm({
mode: "all",
defaultValues: { crewName: groupInfo.crewName, labelColor: groupInfo.labelColor },
resolver: zodResolver(createGroupSchema),
});
useEffect(() => {
// groupInfo๊ฐ ๋ณ๊ฒฝ๋ ๋ ํผ์ ์ฌ์ค์
reset({ crewName: groupInfo.crewName, labelColor: groupInfo.labelColor });
}, [groupInfo.crewName, groupInfo.labelColor]);
์ด์ ๊ทธ๋ฃน ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ์ ๋ ๋ฐ๋ก ๋ฒํผ์ด
disableํ ์ํ๊ฐ ๋๊ณ ์ด์ ๊ฐ์ผ๋ก๋ ๋ณ๊ฒฝํ ์ ์๋ค!

defaultValues - React Hook Form ๊ณต์๋ฌธ์
isDirty, dirtyFields - React Hook Form ๊ณต์๋ฌธ์