Redux Toolkit을 활용한 자바스크립트 앱의 동적 UI 생성 기법

지금까지 Redux는 상태 관리를 위한 뛰어난 도구로 알려져 있습니다. 하지만 Redux를 사용하여 동적인 UI를 생성하는 것은 조금 복잡할 수 있습니다. 이러한 문제를 해결하기 위해 Redux Toolkit이라는 라이브러리가 개발되었습니다. Redux Toolkit은 Redux의 기능을 단순화하고 효율적으로 사용할 수 있는 방법을 제공합니다.

Redux Toolkit의 핵심 기능

  1. createSlice: Redux Toolkit은 createSlice라는 메서드를 제공하여 리듀서와 액션 생성자를 한 번에 정의할 수 있습니다. 이를 통해 간결하고 직관적인 코드 작성이 가능합니다.

예시 코드:

import { createSlice } from '@reduxjs/toolkit';

const counterSlice = createSlice({
  name: 'counter',
  initialState: 0,
  reducers: {
    increment: state => state + 1,
    decrement: state => state - 1,
    reset: () => 0,
  },
});

export const { increment, decrement, reset } = counterSlice.actions;
export default counterSlice.reducer;
  1. configureStore: configureStore 메서드를 사용하여 Redux Toolkit을 초기화할 수 있습니다. 이 메서드는 기본적으로 Redux의 createStore 메서드를 사용하지만 여러 가지 가벼운 미들웨어와 함께 미리 구성된 스토어를 생성할 수 있도록 도와줍니다.

예시 코드:

import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './counterSlice';

const store = configureStore({
  reducer: {
    counter: counterReducer,
  },
});

export default store;

Redux Toolkit을 활용한 동적 UI 생성

  1. Redux 상태를 동적으로 변경하기 위해 Redux Toolkit의 액션 생성자를 사용합니다.

예시 코드:

import { useDispatch, useSelector } from 'react-redux';
import { increment, decrement, reset } from './counterSlice';

const Counter = () => {
  const count = useSelector(state => state.counter);
  const dispatch = useDispatch();

  const handleIncrement = () => {
    dispatch(increment());
  };

  const handleDecrement = () => {
    dispatch(decrement());
  };

  const handleReset = () => {
    dispatch(reset());
  };

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={handleIncrement}>Increment</button>
      <button onClick={handleDecrement}>Decrement</button>
      <button onClick={handleReset}>Reset</button>
    </div>
  );
};

export default Counter;
  1. Redux Toolkit의 도우미 함수를 사용하여 상태 업데이트를 간소화할 수 있습니다.

예시 코드:

import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import { fetchUser } from './api';

export const fetchUserData = createAsyncThunk(
  'user/fetchUserData',
  async (userId, thunkAPI) => {
    const response = await fetchUser(userId);
    return response.data;
  }
);

const userSlice = createSlice({
  name: 'user',
  initialState: { data: null, loading: false },
  reducers: {},
  extraReducers: builder => {
    builder
      .addCase(fetchUserData.pending, state => {
        state.loading = true;
      })
      .addCase(fetchUserData.fulfilled, (state, action) => {
        state.loading = false;
        state.data = action.payload;
      });
  },
});

export default userSlice.reducer;
  1. Redux Toolkit의 createSlice와 configureStore을 함께 사용하여 여러 리듀서와 함께 작업할 수 있습니다.

예시 코드:

import { createSlice, configureStore } from '@reduxjs/toolkit';

const todosSlice = createSlice({
  name: 'todos',
  initialState: [],
  reducers: {
    addTodo: (state, action) => {
      const newTodo = {
        id: Date.now(),
        text: action.payload,
        completed: false,
      };
      state.push(newTodo);
    },
    toggleTodo: (state, action) => {
      const todo = state.find(todo => todo.id === action.payload);
      if (todo) {
        todo.completed = !todo.completed;
      }
    },
    removeTodo: (state, action) => {
      const index = state.findIndex(todo => todo.id === action.payload);
      if (index !== -1) {
        state.splice(index, 1);
      }
    },
  },
});

const store = configureStore({
  reducer: {
    todos: todosSlice.reducer,
  },
});

export const { addTodo, toggleTodo, removeTodo } = todosSlice.actions;
export default store;

#redux #redux-toolkit