[๐Ÿšจ Error ๐Ÿšจ] React-Hook-Form defaultValues ์—๋Ÿฌ

์šฐํ˜ยท2024๋…„ 6์›” 19์ผ

๐Ÿšจ Error ๐Ÿšจ

๋ชฉ๋ก ๋ณด๊ธฐ
9/11

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ฐฐ๊ฒฝ

๊ทธ๋ฃน ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ–ˆ์„ ๋•Œ ๊ทธ๋ฃน ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฟผ๋ฆฌ ํ‚ค๋ฅผ ๋ฌดํšจํ™”ํ•ด์„œ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋Š”๋ฐ 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๋กœ ์„ค์ •๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

  1. ๊ธฐ์กด ๊ทธ๋ฃน ๋ช…: ๋ถ€๋ฆฌ๋ถ€๋ฆฌ โž” defaultValues: { groupName: "๋ถ€๋ฆฌ๋ถ€๋ฆฌ" }
  2. ๊ทธ๋ฃน ๋ช… ๋ณ€๊ฒฝ ํ›„: ๋ถ€๋ฆฌ๋ถ€๋ฆฌ1 โž” defaultValues: { groupName: "๋ถ€๋ฆฌ๋ถ€๋ฆฌ" }
  3. ๋‹ค์‹œ ๊ทธ๋ฃน ๋ช… ๋ณ€๊ฒฝ ์‹œ๋„: ๋ถ€๋ฆฌ๋ถ€๋ฆฌ โž” defaultValues๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์•„ ๋‹ค์‹œ ๊ทธ๋ฃน ๋ช…์„ ํ…Œ์ŠคํŠธ๋กœ ๋ฐ”๊พธ๋ ค๊ณ  ํ•˜๋ฉด isDirty ์˜ต์…˜ ๋•Œ๋ฌธ์— ๋ฒ„ํŠผ์ด disable ์ƒํƒœ๋กœ ๋˜์–ด์žˆ์–ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

๐Ÿ’ก React-Hook-Form์˜ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ๊น defaultValues๋Š” ์บ์‹œ๊ฐ€ ๋˜์–ด ์žฌ์„ค์ •์„ ํ•˜๋ ค๋ฉด reset api๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋‚˜์™€์žˆ๋‹ค!


๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

1. next/router์˜ reload ์‚ฌ์šฉํ•˜๊ธฐ

์ƒˆ๋กœ๊ณ ์นจ์ด ์ƒ๊ฒจ ๊ทธ๋ ‡๊ฒŒ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ์ง€๋งŒ ํ˜น์‹œ๋ผ๋„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๋ชป์ฐพ์œผ๋ฉด ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค...

2. ๊ณต์‹๋ฌธ์„œ์—์„œ ๊ถŒ์žฅํ•˜๋Š” 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 ๊ณต์‹๋ฌธ์„œ

0๊ฐœ์˜ ๋Œ“๊ธ€