본문 바로가기

리액트 React/Hooks

리액트 훅스 Hooks 7: 커스텀 훅

반응형

여러 컴포넌트에서 비슷한 기능을 공유할 경우 커스텀 훅을 이용하여 로직을 분할할 수 있습니다.

적절히 사용하면 컴포넌트를 깔끔하게 만들고 매인 로직에만 집중 할 수 있습니다.

 

기존 Info.js
import React, { useReducer } from "react";

function reducer(state, action) {
  return {
    ...state,
    [action.name]: action.value
  };
}

const Info = () => {
  const [state, dispatch] = useReducer(reducer, {
      email:'',
      password:''
  });

  const {email, password} = state;
  const onChange = e => {
      dispatch(e.target);
  }

  return (
    <div>
      <div>
        <input name="email" value={email} onChange={onChange} />
        <input name="password" value={password} onChange={onChange} />
      </div>
    </div>
  );
};

export default Info;

위에 Info 컴포넌트에서 useReducer를 이용하여 작성했던 로직을 useInputs라는 훅으로 분리해보겠습니다.

 

useInputs.js
import React, {useReducer} from 'react';

function reducer(state, action) {
    return {
        ...state,
        [action.name]: action.value
    };
}

export default function useInputs(initialForm) {
    const [state, dispatch] = useReducer(reducer, initialForm);
    const onChange = e => {
        dispatch(e.target);
    };
    return [state, onChange];
}

다시 Info.js로 돌아와서..

 

import React, { useReducer } from "react";
import useInputs from "./useInputs";

const Info = () => {
  const [state, onChange] = useInputs({
    email: "",
    password: "",
  });

  const {email, password} = state;
  

  return (
    <div>
      <div>
        <input name="email" value={email} onChange={onChange} />
        <input name="password" value={password} onChange={onChange} />
      </div>
    </div>
  );
};

export default Info;

처음 Info컴포넌트보다 한층 간결해졌습니다.

반응형

'리액트 React > Hooks' 카테고리의 다른 글

리액트 훅스 Hooks 6: useRef  (0) 2021.02.04
리액트 훅스 Hooks 5: useCallback  (0) 2021.02.03
리액트 훅스 Hooks 4: useMemo  (0) 2021.02.03
리액트 훅스 Hooks 3: useReducer  (0) 2021.02.03
리액트 훅스 Hooks 2: useEffect  (0) 2021.02.02