ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • react-hook-form 적용기 (antd)
    Language/React 2023. 12. 18. 13:18

    구 버전의 node 14.17.4 + react 16.13.1 에서 react-hook-form을 적용해보자.

    react-hook-form은 Node 16.0.0 이상을 권장한다고 하는데 다음 분기때 버전 올릴 계획도 있고 백오피스에 적용하는거라서 큰 문제가 발생하지 않는다고 판단되어 적용하기로 하였다. 이런 저런 핑계로 지금 안하면 나중에도 못한다.!

     

    Node버전과 React버전 별 사용가능한 react-hook-form 버전

    Node 버전 React 버전 react-hook-form 버전
    12.17.0 이상 16.8.0 이상 7.3.0 이상
    14.17.0 이상 16.13.0 이상 7.3.0 이상
    16.0.0. 이상 17.0.0 이상 7.3.0 이상
    17.0.0. 이상 18.0.0 이상 7.3.0 이상

     

    필자가 운영하는 플랫폼은 node 14.17.4 + react 16.13.1 임으로 react-hook-form을 7.3.1로 설치하였다.

    $ yarn add react-hook-form@7.3.1

     

     

    import 코드

    import { useForm, Controller } from 'react-hook-form';
    import FormErrorMessage from 'components/FormErrorMessage';
    
    import { Modal, message, Checkbox, Input, InputNumber, Select } from 'antd';

     

    Form 코드

    Input

    <Controller
        name="TEST"
        control={control}
        rules={{ required: 'TEST은(는) 필수 입력입니다.' }}
        render={({ field }) => (
          <>
            <Input {...field} className={cx({ error: errors.TEST })} placeholder="TEST을 입력해주세요." maxLength={50} />
            {errors.TEST && <FormErrorMessage message={errors.TEST.message} />}
          </>
        )}
      />

     

    InputNumber

    <Controller
        name="TEST"
        control={control}
        // rules={{ required: 'TEST은(는) 필수 입력입니다.' }}
        render={({ field }) => (
          <>
            <InputNumber
              {...field}
              className={cx({ error: errors.TEST })}
              placeholder="TEST를 입력해주세요."
              // showCount
              maxLength={4}
            />
    
            {errors.TEST && <FormErrorMessage message={errors.TEST.message} />}
          </>
        )}
      />

     

    Checkbox

    <Controller
      name="TEST"
      control={control}
      render={({ field }) => (
        <>
          <Checkbox {...field} className={cx({ error: errors.TEST })} checked={field.value}>
            TEST
          </Checkbox>
          {errors.TEST && <FormErrorMessage message={errors.TEST.message} />}
        </>
      )}
    />

     

    Radio

    const DISPLAY_TYPES = { '01': '공개', '02': '비공개', '03': '일부공개(웹)' }
    ...
    
    <Controller
        name="TEST"
        control={control}
        rules={{ required: 'TEST은 필수 입력입니다.' }}
        render={({ field }) => (
          <>
            <div className={cx('row-box', { error: errors.TEST })}>
              <Radio.Group {...field} className={cx({ error: errors.TEST })} placeholder="TEST을 입력해주세요.">
                {Object.keys(DISPLAY_TYPES).map((item, idx) => (
                  <Radio key={idx} value={item}>
                    {DISPLAY_TYPES[item]}
                  </Radio>
                ))}
              </Radio.Group>
            </div>
    
            {errors.TEST && <FormErrorMessage message={errors.TEST.message} />}
          </>
        )}
    />

     

    Select

    <Controller
        name="TEST"
        control={control}
        rules={{ required: 'TEST은(는) 필수 입력입니다.' }}
        render={({ field }) => (
          <>
            <Select
              {...field}
              className={cx({ error: errors.TEST })}
              // mode="tags"
              mode="multiple"
              tokenSeparators={[' ']}
              placeholder="TEST 선택"
              options={options}
            />
    
            {errors.TEST && <FormErrorMessage message={errors.TEST.message} />}
          </>
        )}
    />

     

    ImageSelector

    # ImageSelector는 커스텀으로 만든 셀렉터
    
    <Controller
        name="TEST"
        control={control}
        rules={{ required: 'TEST는 필수 입력입니다.' }}
        render={({ field }) => (
          <>
            <div className={cx('row-box', { error: errors.TEST })}>
              <ImageSelector
                {...field}
                type="single"
                value={field.value && { src: field.value }}
                onChange={(value) => {
                  if (value !== null) {
                    field.onChange(value.src);
                  } else {
                    field.onChange(null);
                  }
                }}
              />
            </div>
    
            {errors.TEST && <FormErrorMessage message={errors.TEST.message} />}
          </>
        )}
    />

     

    TextArea

    <Controller
        name="TEST"
        control={control}
        // rules={{ required: 'TEST은(는) 필수 입력입니다.' }}
        render={({ field }) => (
          <>
            <Input.TextArea
              {...field}
              className={cx({ error: errors.TEST })}
              placeholder="TEST을 입력해주세요."
              rows={2}
              showCount
              maxLength={200}
            />
    
            {errors.TEST && <FormErrorMessage message={errors.TEST.message} />}
          </>
        )}
    />

     

    WebEditor

    # TinyMceEditor 은 커스텀으로 만든 웹에디터
    
    <Controller
        name="CONTENT"
        control={control}
        rules={{ required: '콘텐츠 내용은 필수 입력입니다.' }}
        render={({ field }) => (
          <>
            <div className={cx('row-box', { error: errors.CONTENT })}>
              <TinyMceEditor
                {...field}
                height="20vh"
                content={field.value}
                onChange={(content) => {
                  field.onChange(content);
                }}
              />
            </div>
    
            {errors.CONTENT && <FormErrorMessage message={errors.CONTENT.message} />}
          </>
        )}
    />

     

     

    지금은 시간상 급하게 넣느라 코드가 복잡해 보인다!!! 시간될때 좀더 코드를 줄일수 있는 방법을 생각해보자.

    useController등을 통한 각각의 atomic한 컴포넌트 형태로... 암튼 생각생각!

     

     

     

     

    참고)

    https://react-hook-form.com/form-builder

     

    Form Builder

    Performant, flexible and extensible forms with easy-to-use validation.

    react-hook-form.com

     

     

    https://mycodings.fly.dev/blog/2023-09-10-all-in-one-about-react-hook-form

     

    React Hook Form 사용법 완결판 - 초급편

    react-hook-form 라이브러리 사용법 완결판 - 초급편

    mycodings.fly.dev

    https://mycodings.fly.dev/blog/2023-09-11-enhanced-tutorial-of-react-hook-form

     

    React Hook Form 사용법 완결판 - 고급편

    React Hook Form 고급 사용 방법

    mycodings.fly.dev

     

    댓글

Designed by Tistory.