React

Slice

Lulung 2024. 12. 23. 13:51

Redux Slice는 Redux 상태와 관련 로직을 간단하고 효율적으로 관리하기 위한 구조다. Redux Toolkit을 사용할 때 핵심적으로 등장하는 개념으로 상태(state), 액션(action), 리듀서(reducer)를 한 곳에서 정의할 수 있게 도와준다.

 

Redux Slice란?

Slice는 전체 Redux 상태의 조각이다. 애플리케이션 상태를 여러 개의 Slice로 나눠서 관리할 수 있다.

 

구성 요소

1. State (상태) : Slice는 해당 조각의 초기 상태를 정의한다. 
예: isLoggedIn, userName 같은 상태.

2. Reducers (상태 변경 함수) : 상태를 어떻게 업데이트할지 정의하는 함수들. 리듀서는 Action을 처리하고, 새로운 상태를 반환한다.

3. Actions (상태 변경 요청) : Slice는 Actions을 자동으로 생성한다. dispatch를 통해 상태 변경 요청을 보낼 때 사용.

 

useDispatch

Redux의 액션(action)을 보낼(dispatch) 수 있는 함수를 가져온다. Redux 상태를 업데이트하거나, 비동기 작업을 실행하는 데 사용된다.

import { useDispatch } from 'react-redux';
import { login, logout } from './store/slices/userSlice'; // Slice에서 액션 가져오기

function UserActions() {
  const dispatch = useDispatch(); // dispatch 함수 가져오기

  const handleLogin = () => {
    dispatch(login('Kim Mi Seon')); // login 액션을 디스패치
  };

  const handleLogout = () => {
    dispatch(logout()); // logout 액션을 디스패치
  };

  return (
    <div>
      <button onClick={handleLogin}>Log In</button>
      <button onClick={handleLogout}>Log Out</button>
    </div>
  );
}

createAsyncThunk를 사용하면 비동기 액션 처리가 가능하다.

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

// 비동기 Thunk
export const fetchUser = createAsyncThunk(
  'user/fetchUser',
  async (userId) => {
    const response = await fetch(`/api/users/${userId}`);
    const data = await response.json();
    return data;
  }
);

const userSlice = createSlice({
  name: 'user',
  initialState: { isLoading: false, data: null, error: null },
  extraReducers: (builder) => {
    builder
      .addCase(fetchUser.pending, (state) => {
        state.isLoading = true;
      })
      .addCase(fetchUser.fulfilled, (state, action) => {
        state.isLoading = false;
        state.data = action.payload;
      })
      .addCase(fetchUser.rejected, (state, action) => {
        state.isLoading = false;
        state.error = action.error.message;
      });
  },
});

export default userSlice.reducer;
import { useDispatch, useSelector } from 'react-redux';
import { fetchUser } from './store/slices/userSlice';

function UserInfo({ userId }) {
  const dispatch = useDispatch();
  const { isLoading, data, error } = useSelector((state) => state.user);

  const handleFetchUser = () => {
    dispatch(fetchUser(userId)); // Thunk 실행
  };

  if (isLoading) return <div>Loading...</div>;
  if (error) return <div>Error: {error}</div>;

  return (
    <div>
      <button onClick={handleFetchUser}>Fetch User</button>
      {data && <div>User Name: {data.name}</div>}
    </div>
  );
}

'React' 카테고리의 다른 글

async await  (0) 2024.12.23
map 함수  (1) 2024.12.23
일반함수 / 화살표 함수 / 메서드 차이  (0) 2024.12.19
동기와 비동기  (0) 2024.12.19
콜백 함수  (0) 2024.12.19