useMultiState

Introduction

이 훅은 React 애플리케이션에서 다양한 상태를 하나의 훅으로 관리하기 위해 만들어진 유틸리티입니다. 다수의 상태를 효과적으로 관리하면서 코드를 간결하게 유지할 수 있습니다. 아래는 이 훅을 사용하는 간단한 예제와 설명입니다.

Example

import React from "react";

function ExampleComponent() {
  // 초기 상태 정의
  const initialStates = {
    username: "",
    email: "",
    age: 0,
  };

  // useMultiState 훅을 사용하여 상태 및 이벤트 핸들러 가져오기
  const [state, dispatch, onChange, onClear] = useMultiState(initialStates);

  return (
    <div>
      <label>
        Username:
        <input type="text" name="username" value={state.username} onChange={onChange} />
        <button onClick={() => onClear("username")}>Clear</button>
      </label>

      <label>
        Email:
        <input type="email" name="email" value={state.email} onChange={onChange} />
        <button onClick={() => onClear("email")}>Clear</button>
      </label>

      <label>
        Age:
        <input type="number" name="age" value={state.age} onChange={onChange} />
        <button onClick={() => onClear("age")}>Clear</button>
      </label>

      <div>
        <p>Current State:</p>
        <pre>{JSON.stringify(state, null, 2)}</pre>
      </div>
    </div>
  );
}

export default ExampleComponent;

이 예시 코드에서 useMultiState 훅을 사용하여 username, email, age 세 가지 상태를 관리하고 있습니다. 각 입력 필드는 해당 상태를 제어하며, "Clear" 버튼을 클릭하면 해당 필드의 값을 초기화합니다. 현재의 전체 상태는 state 객체로 확인할 수 있습니다. 이렇게 하나의 훅으로 여러 상태를 효과적으로 관리할 수 있어 코드를 깔끔하게 유지할 수 있습니다.

Hook

import React from "react";

interface StateType {
  [key: string]: string | string[] | any;
}

interface ActionType {
  name: string;
  value: string | any;
}

type DispatchType = React.Dispatch<ActionType>;
type ChangeEventType = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
type ClearEventType = (name: string) => void;
type ReturnType = [StateType, DispatchType, ChangeEventType, ClearEventType];

/**
 * 이 훅은 많은 상태관리를 하나의 훅으로 유용하게 하기 위해서 만들어졌습니다.
 * 다양한 상태들을 하나의 훅으로 관리하면서 더욱 편리하게 상태관리를 할 수 있습니다.
 *
 * @template StateType - 초기값을 나타내는 타입
 * @param {StateType} initialState - 상태관리 타입
 * @returns {ReturnType} 배열형태의 상태관리와 이벤트 핸들러, 삭제 핸들러를 반환한다.`
 */

const reducer = (state: StateType, action: ActionType): StateType => {
  return {
    ...state,
    [action.name]: action.value,
  };
};

export default function useMultiState(initialState: StateType = {}): ReturnType {
  const [state, dispatch] = React.useReducer(reducer, initialState);

  const onChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
    if (!e.target) return;
    return dispatch({ name: e.target?.name, value: e.target?.value });
  };

  const onClear = (name: string) => dispatch({ name, value: "" });

  return [state, dispatch, onChange, onClear];
}

이 훅을 통해서 많은 상태관리를 하나의 훅으로 관리할 수 있게 합니다.

Last updated