Redux Thunk를 사용한 드롭다운 메뉴 구현 예제

이 예제는 Redux Thunk를 사용하여 드롭다운 메뉴를 구현하는 방법을 보여줍니다. Redux Thunk는 비동기 작업을 처리하기 위해 Redux에서 사용되는 미들웨어입니다.

프로젝트 설정

먼저, Redux와 Redux Thunk를 설치합니다.

npm install redux redux-thunk

다음으로, Redux store를 설정합니다. store.js 파일을 생성하고 아래의 코드를 추가합니다.

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './reducers';

const store = createStore(rootReducer, applyMiddleware(thunk));

export default store;

액션과 리듀서 설정

액션 타입과 액션 생성자 함수를 정의합니다. actions.js 파일을 생성하고 아래의 코드를 추가합니다.

export const SET_MENU_ITEMS = 'SET_MENU_ITEMS';
export const TOGGLE_DROPDOWN = 'TOGGLE_DROPDOWN';

export const setMenuItems = (items) => {
  return {
    type: SET_MENU_ITEMS,
    payload: items
  }
}

export const toggleDropdown = () => {
  return {
    type: TOGGLE_DROPDOWN
  }
}

다음으로, 리듀서를 작성합니다. reducer.js 파일을 생성하고 아래의 코드를 추가합니다.

import { SET_MENU_ITEMS, TOGGLE_DROPDOWN } from './actions';

const initialState = {
  menuItems: [],
  isDropdownOpen: false
}

const reducer = (state = initialState, action) => {
  switch (action.type) {
    case SET_MENU_ITEMS:
      return {
        ...state,
        menuItems: action.payload
      }
    case TOGGLE_DROPDOWN:
      return {
        ...state,
        isDropdownOpen: !state.isDropdownOpen
      }
    default:
      return state;
  }
}

export default reducer;

비동기 작업 처리

드롭다운 메뉴에서 비동기로 데이터를 가져오는 작업을 처리하기 위해 Redux Thunk를 사용합니다. actions.js 파일에 아래의 코드를 추가합니다.

export const fetchMenuItems = () => {
  return (dispatch) => {
    // API로부터 데이터를 가져오는 비동기 작업을 수행
    // 비동기 작업이 완료되면 액션을 디스패치하여 상태를 업데이트
    API.get('/menuItems')
      .then((response) => {
        dispatch(setMenuItems(response.data));
      })
      .catch((error) => {
        console.log(error);
      });
  }
}

컴포넌트 구현

드롭다운 메뉴를 렌더링하는 컴포넌트를 구현합니다. DropdownMenu.js 파일을 생성하고 아래의 코드를 추가합니다.

import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { fetchMenuItems, toggleDropdown } from './actions';

const DropdownMenu = () => {
  const dispatch = useDispatch();
  const menuItems = useSelector(state => state.menuItems);
  const isDropdownOpen = useSelector(state => state.isDropdownOpen);

  useEffect(() => {
    dispatch(fetchMenuItems());
  }, [dispatch]);

  const handleDropdownToggle = () => {
    dispatch(toggleDropdown());
  }

  return (
    <div className="dropdown">
      <button className="dropdown-toggle" onClick={handleDropdownToggle}>
        Toggle Dropdown
      </button>
      {isDropdownOpen && (
        <ul className="dropdown-menu">
          {menuItems.map(item => (
            <li key={item.id}>{item.title}</li>
          ))}
        </ul>
      )}
    </div>
  );
}

export default DropdownMenu;

애플리케이션에서 사용

마지막으로, 애플리케이션에서 DropdownMenu 컴포넌트를 사용합니다. App.js 파일에 아래의 코드를 추가합니다.

import React from 'react';
import { Provider } from 'react-redux';
import store from './store';
import DropdownMenu from './DropdownMenu';

const App = () => {
  return (
    <Provider store={store}>
      <div className="app">
        <h1>Dropdown Menu Example</h1>
        <DropdownMenu />
      </div>
    </Provider>
  );
}

export default App;

이제 Redux Thunk를 사용하여 드롭다운 메뉴를 비동기로 로드하고 상태를 업데이트할 수 있는 예제가 완성되었습니다.


참고 자료