[React] CustomHook

Main·2023년 7월 22일
0

React

목록 보기
5/31
post-thumbnail

CustomHook ?

커스텀 훅은 리액트 함수형 컴포넌트에서 로직을 재사용하기 위한 방법 중 하나입니다. 함수형 컴포넌트에서는 상태 관리와 라이프사이클 관리를 useState, useEffect와 같은 훅을 사용하여 처리합니다. 하지만 컴포넌트가 커지면서 특정 로직이 중복되거나 복잡해지는 경우가 발생할 수 있습니다. 이런 경우, 해당 로직을 커스텀 훅으로 추출하여 로직을 분리하고 재사용성을 높일 수 있습니다.

CustomHook의 장점

  • 코드의 가독성이 증가합니다.
  • 코드의 중복사용을 피할 수 있으며, 재사용성이 증가합니다.
  • 코드의 유지 보수가 용이해집니다.
  • 로직 분리가 가능해집니다.

useInput customhook 구현 코드

import { useState } from "react";

export const useInput = (initalValue, reg) => {
  const [value, setValue] = useState(initalValue);
  const [isValid, setIsvalid] = useState(true);

  const onChange = (e) => {
    const inputValue = e.target.value.trim();
    setValue(inputValue);
    setIsvalid(reg.test(inputValue));
  };

  return [value, onChange, isValid];
};

useInput 미적용 코드

export default function Customhook() {
  const [emailValue, setEmailValue] = useState("");
  const [emailValid, setEmailValid] = useState(true);
  const emailReg = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;

  const [pwValue, setPwValue] = useState("");
  const [pwValid, setPwValid] = useState(true);
  const pwReg = /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[@#$%^&+=!])(?!.*\s).{8,16}$/;

  const onChangeValue = (value, setValue, setIsValid, reg) => {
    const inputValue = value.trim();
    setValue(inputValue);
    setIsValid(reg.test(inputValue));
  };
  return (
    <form>
      <div>
        <label htmlFor="email">이메일 : </label>
        <input
          id="email"
          type="text"
          value={emailValue}
          onChange={(e) =>
            onChangeValue(
              e.target.value,
              setEmailValue,
              setEmailValid,
              emailReg
            )
          }
        />
        {!emailValid && (
          <p style={{ color: "red", fontSize: "12px" }}>
            유효한 이메일을 입력하세요.
          </p>
        )}
      </div>
      <div>
        <label htmlFor="pw">비밀번호 : </label>
        <input
          id="pw"
          type="password"
          value={pwValue}
          onChange={(e) =>
            onChangeValue(e.target.value, setPwValue, setPwValid, pwReg)
          }
        />
        {!pwValid && (
          <p style={{ color: "red", fontSize: "12px" }}>
            8-16자 특수문자+영문+숫자 조합의 비밀번호를 입력해주세요.
          </p>
        )}
      </div>
    </form>
  );

useInput 적용 코드

import React from "react";
import { useInput } from "./useInput";

export default function Customhook() {
  const [emailValue, onChangeEmail, isEmailValid] = useInput(
    "",
    /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/
  );
  const [pwValue, onChangePw, isPwValid] = useInput(
    "",
    /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[@#$%^&+=!])(?!.*\s).{8,16}$/
  );
  return (
    <form>
      <div>
        <label htmlFor="email">이메일 : </label>
        <input id="email" value={emailValue} onChange={onChangeEmail} />
        {!isEmailValid && (
          <p style={{ color: "red", fontSize: "12px" }}>
            유효한 이메일을 입력하세요.
          </p>
        )}
      </div>

      <div>
        <label htmlFor="pw">비밀번호 : </label>
        <input id="pw" value={pwValue} onChange={onChangePw} />
        {!isPwValid && (
          <p style={{ color: "red", fontSize: "12px" }}>
            8-16자 특수문자+영문+숫자 조합의 비밀번호를 입력해주세요.
          </p>
        )}
      </div>
    </form>
  );
}
  );
}
  • custom hook은 use키워드로 시작해야합니다.
  • useInput customhook에서는 value와 isVaild라는 두 가지 상태를 갖습니다.
  • value는 해당 input의 value, isVaild는 해당 value가 유효한지를 나타내는 상태입니다.
  • 인자 값으로 initalState(초기값)과 reg(유효성 검사에 필요한 정규표현식)을 받습니다.
  • onChange 함수를 통해 value값을 업데이트해주고, 인자로 받은 reg를 통해 value 값이 유효한지 검사합니다.
  • value, onChange, isValid 값을 반환하여 사용할 수 있도록 합니다.

useInput를 미적용한 코드에 비해 적용한 코드는 훨씬 간결해진것을 볼 수 있습니다.
만약 useInput이 다른 코드에서도 사용된다면 코드의 중복사용이 줄어들 것입니다.


정리

커스텀 훅은 리액트에서 코드의 재사용성과 가독성을 높이는 효과적인 방법 중 하나입니다. 공통된 로직을 커스텀 훅으로 추출하면 코드 중복을 줄이고 유지보수성을 높일 수 있습니다. 컴포넌트의 크기와 복잡도가 증가할수록 커스텀 훅은 더욱 유용하게 활용될 수 있습니다.

profile
함께 개선하는 개발자

0개의 댓글