[๐Ÿšจ Error ๐Ÿšจ] React-Hook-Form ๋“œ๋กญ๋‹ค์šด value ๋™๊ธฐํ™” ์—๋Ÿฌ

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

๐Ÿšจ Error ๐Ÿšจ

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

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

๋“œ๋กญ๋‹ค์šด์˜ ๊ฐ’์„ React-Hook-Form์œผ๋กœ ์ œ์–ดํ•  ๋•Œ value ๊ฐ’์ด ๋™๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ

์˜์ƒ๊ณผ ๊ฐ™์ด form์„ ์ œ์ถœํ•˜๋ฉด value ๊ฐ’์ด ๋™๊ธฐํ™”๋˜์ง€ ์•Š๊ณ  ์ดˆ๊ธฐ ๊ฐ’์ด ์ œ์ถœ๋˜๊ณ  ์žˆ๋‹ค!


๋ฌธ์ œ์˜ ์›์ธ ์•Œ์•„๋ณด๊ธฐ

1. Dropdown ์ปดํฌ๋„ŒํŠธ์˜ input์— value๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ธฐ

<input type="hidden" name="assigneeUserId" value="8494">

๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ ํ™•์ธํ•ด๋ดค์„ ๋•Œ value ๊ฐ’์€ ์ •์ƒ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค.

2. input์˜ value ๊ฐ’ ์ง€์›Œ๋ณด๊ธฐ

React-Hook-Form์˜ register ํ•จ์ˆ˜์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ name, value, onChange, onBlur ๋“ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— value ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  rest props์œผ๋กœ ๋‚ด๋ ค์ฃผ๋ฉด ๋œ๋‹ค.

<input type="text" {...register} />

์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ  input์˜ ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ณ  submitํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๊ฐ’์ด ๋™๊ธฐํ™”๋œ๋‹ค.

โ†ช value๋ฅผ ์ง์ ‘ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์•„์•ผ ํ•˜๋Š”๋ฐ ๋‚˜๋Š” Dropdown์˜ ํ•˜์œ„๋ฉ”๋‰ด๋ฅผ ํด๋ฆญํ•˜๋ฉด ๊ทธ ํด๋ฆญํ•œ ํ•˜์œ„๋ฉ”๋‰ด์˜ id๋ฅผ value๋กœ ์ง€์ •ํ•ด์ค˜์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค...


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

1. Dropdown์˜ input์„ ์ œ์–ดํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ

useState๋กœ Dropdown์˜ input value๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋‹ฌ์—์„œ๋Š” Dropdown๋งŒ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ input ๊ฐ’๋“ค๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ๊ฑด React-Hook-Form์„ ์‚ฌ์šฉํ•˜๊ณ  Dropdown์˜ input์€ useState๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ด์งˆ๊ฐ์ด ๋“ ๋‹ค..

2. Dropdown์˜ input์— ref๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ

Dropdown์˜ input์— ref๋ฅผ forwardRef๋กœ ์—ฐ๊ฒฐํ•ด์„œ ์ œ์ถœ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น input์˜ value ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹๋„ ์žˆ์ง€๋งŒ 1๋ฒˆ ๋ฐฉ์‹๊ณผ ๊ฐ™์ด React-Hook-Form์œผ๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ด์งˆ๊ฐ์ด ๋“ ๋‹ค..

3. <select>, <option> ํƒœ๊ทธ ์‚ฌ์šฉํ•˜๊ธฐ

Dropdown์— <select>, <option> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด React-Hook-Form์„ ์‚ฌ์šฉํ•ด์„œ Dropdown์˜ value ๊ฐ’์„ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ <select>, <option> ํƒœ๊ทธ์˜ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์„œ ๋””์ž์ธ์ด ๋ณ„๋กœ์ธ ๋‹จ์ ์ด ์žˆ๋‹ค..

์‚ฌ์‹ค ์œ„์˜ ๋ฐฉ๋ฒ•๋“ค์€ ๊ธˆ๋ฐฉ ์ƒ๊ฐ๋‚ฌ์ง€๋งŒ ๋‹ค ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด์—ฌ์„œ React-Hook-Form์˜ ๊ณต์‹๋ฌธ์„œ์— ๋“ค์–ด๊ฐ€์„œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์ด ์—†๋Š”์ง€ ์ฐพ์•„๋ณด๋˜ ์ค‘ setValue๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ฐพ์•˜๋‹ค!

4. React-Hook-Form์˜ setValue ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ

์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ์–ด๋ ต์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™๋‹ค!

setValue(name, value, options)

name: ์ด๋ฆ„์„ ๋‹จ์ผ ํ•„๋“œ๋กœ ํƒ€๊ฒŸํŒ… ํ•œ๋‹ค.(register ํ•จ์ˆ˜์˜ name์„ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค.)
value: ํ•„๋“œ์˜ ๊ฐ’, name value์— ๋„ฃ๊ณ  ์‹ถ์€ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.(ํ•„์ˆ˜)
options: options์˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๋“ค๋„ ์žˆ์ง€๋งŒ ๋‚˜๋Š” ์ง€๊ธˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

  • EditToDoModal ์ฝ”๋“œ ์ˆ˜์ •
function EditToDoModal({showModal,handleClose,}: ModalProps) {
  const {
    register,
    formState: { isValid, isSubmitting },
    setError,
    handleSubmit,
    setValue,
  } = useForm<FormValues>();
  
  <form onSubmit={handleSubmit(handleValidSubmit)}>
    <div>
      <Dropdown
        usage="state"
        data={columns}
        initialData={{ title: currentState?.title, id: currentState?.id }}
        register={register('columnId')}
        setValue={setValue}
        />
      <Dropdown
        usage="manager"
        data={members}
        initialData={{
          nickname: assignee?.nickname,
            profileImageUrl: assignee?.profileImageUrl || '',
            id: assignee?.id,
        }}
        register={register('assigneeUserId')}
        setValue={setValue}
        />
    </div>
    <div>
      <ModalButton onClick={handleClose}>์ทจ์†Œ</ModalButton>
      <ModalButton type="submit" disabled={!isValid || isSubmitting}>
        ์ˆ˜์ •
      </ModalButton>
    </div>
  </form>
}
  • Dropdown ์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ ์ˆ˜์ •
const handleItemClick = (data: EditTodoFormData): void => {
  setIsSelectData({
    isClick: true,
    id: data.id,
    title: data.title,
    nickname: data.nickname,
    profileImageUrl: data.profileImageUrl,
  });
  setValue(register.name, data.id);
};

 <input type="hidden" {...register} />

์ตœ์ข… ๋™์ž‘ ์˜์ƒ

์ด์ œ๋Š” form ์ œ์ถœํ•˜๋ฉด value ๊ฐ’์ด ์ •์ƒ์ ์œผ๋กœ ๋™๊ธฐํ™”๋œ๋‹ค๐Ÿ™ƒ๐Ÿ™ƒ๐Ÿ™ƒ

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