Create Custom Hook
2020-06-30

컴포넌트를 만들다 보면 반복되는 로직이 발생한다. input을 관리하는 꾀나 자주 작성하게되는 코드이다.

cosnt onChange = (e) => {
	const {name, value} = e.target;
	setInputs({...inputs, [name] : value});
}

이런 경우 custom hook을 만들 수 있다. input 상태를 관리하는 hook을 만들어 보자.

useInputs.js

import {useState, useCallback} from 'react';

function useInputs(initialForm){

    const [form, setForm] = useState(initialForm);

    const onChange = useCallback(e => {
        const {name, value} = e.target;
        setForm(form => ({...form, [name]: value}));
    }, []);

    const reset = useCallback(() => setForm(initialForm), [initialForm]);

    return [form, onChange, reset];
}

export default useInputs;

아래는 useReducer 를 이용하여 만든 useInputs custom hook 이다.

useInputs.js

import {useReducer, useCallback} from 'react';

function reducer(state, action){
    switch (action.type) {
        case 'CHANGE_INPUT':
            return {...state, [action.name] : action.value};
        case 'RESET' :
            return Object.keys(state).reduce((acc, current) => {
                acc[current] = '';
                return acc;
            }, {});
        default :
            throw new Error('Unhandeled action');
    }

}

function useInputs(initialForm){

    const [form, dispatch] = useReducer(reducer, [initialForm]);

    const onChange = useCallback(e => {
        const {name, value} = e.target;
        dispatch({
            type : 'CHANGE_INPUT',
            name,
            value
        });
    }, []);

    const reset = useCallback(() => {
        dispatch({type: 'RESET'});
    }, []);

    return [form, onChange, reset];
}

export default useInputs;
© 2020, Built with Gatsby, React, Typscript, styled-components