[React] custom hook

챔수·2023년 5월 22일
0

개발 공부

목록 보기
65/101

개발자가 스스로 커스텀한 훅을 의미하고 이를 이용해 반복되는 로직을 함수로 뽑아서 재사용 할 수 있다. 커스텀훅을의 장점으로는 3가지를 들 수 있다.

  1. 상태관리 로직의 재활용이 가능하다.
  2. 클래스 컴포넌트보다 적은 양의 코드로 동일한 로직을 구현할 수 있다.
  3. 함수형으로 작성하기 때문에 보다 명료하게 볼 수 있다.

custom hook을 이용하여 input 로직 분리하기

import { useState } from "react";
import useInput from "./util/useInput";
import Input from "./component/Input";
import "./styles.css";

export default function App() {
  const [firstNameValue, setFirstNameValue] = useState("");
  const [lastNameValue, setLastNameValue] = useState("");
  const [nameArr, setNameArr] = useState([]);

  const handleSubmit = (e) => {
    e.preventDefault();
    setNameArr([...nameArr, `${firstNameValue} ${lastNameValue}`]);
  };

  return (
    <div className="App">
      <h1>Name List</h1>
      <div className="name-form">
        <form onSubmit={handleSubmit}>
          <div className="name-input">
            <label></label>
            <input
              value={firstNameValue}
              onChange={(e) => setFirstNameValue(e.target.value)}
              type="text"
            />
          </div>
          <div className="name-input">
            <label>이름</label>
            <input
              value={lastNameValue}
              onChange={(e) => setLastNameValue(e.target.value)}
              type="text"
            />
          </div>
          <button>제출</button>
        </form>
      </div>
      <div className="name-list-wrap">
        <div className="name-list">
          {nameArr.map((el, idx) => {
            return <p key={idx}>{el}</p>;
          })}
        </div>
      </div>
    </div>
  );
}

input 로직 분리하기의 예시로 나온 코드이다. 일단 Input컴포넌트와 useInput이 만들어 지지 않은 상태에서 import가 되있는게 확인 됬다.
Input컴포넌트는 예시 코드를 보면 labelvalue에 들어간 값을 제외하고는 똑같은 구조를 하고있는것을 볼 수 있다. 우선 Input컴포넌트를 만들어 줬다.

Input

function Input({ labelText, value }) {
  return (
    <div className="name-input">
      <label>{labelText}</label>
      <input {...value} type="text" />
    </div>
  );
}

export default Input;
  • props로 labelText, value의 값을 전달 해주고 labelinput에 값이 달라져야 하기 때문에 넣어줬다.

useInput.js

import { useState } from "react";

function useInput(initialValue) {
  const [value, setValue] = useState(initialValue);

  const bind = {
    value,
    onChange: (e) => {
      setValue(e.target.value);
    }
  };

  const reset = () => {
    setValue(initialValue);
  };
  
//return 해야 하는 값은 배열 형태의 값
  return [value, bind, reset];
}

export default useInput;

만든 컴포넌트와 커스텀훅을 이용해 App.js를 바꿔준다.

App.js

import { useState } from "react";
import useInput from "./util/useInput";
import Input from "./component/Input";
import "./styles.css";

export default function App() {
  
  const [fistValue, firstBind, firstReset] = useInput("");
  const [lastValue, lastBind, lastReset] = useInput("");
  const [nameArr, setNameArr] = useState([]);

  const handleSubmit = (e) => {
    e.preventDefault();
    setNameArr([...nameArr, `${fistValue} ${lastValue}`]);
    firstReset();
    lastReset();
  };

  return (
    <div className="App">
      <h1>Name List</h1>
      <div className="name-form">
        <form onSubmit={handleSubmit}>
          <Input labelText={"성"} value={firstBind} />
          <Input labelText={"이름"} value={lastBind} />
          <button>제출</button>
        </form>
      </div>
      <div className="name-list-wrap">
        <div className="name-list">
          {nameArr.map((el, idx) => {
            return <p key={idx}>{el}</p>;
          })}
        </div>
      </div>
    </div>
  );
}
profile
프론트앤드 공부중인 챔수입니다.

0개의 댓글