Frontend Academy · レッスン

Redux Toolkit:createSlice と configureStore

createSlice で state のスライスを定義し、configureStore でまとめ、useDispatch と useSelector を使って React コンポーネントからアクションを dispatch します。

レッスン 1/413 ステップ

「Redux Toolkit:createSlice と configureStore」はCoddyKit上の無料Frontend Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはFrontend Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Frontend Academyコースには全4レッスンが含まれています。

Redux Toolkit を使う理由

Redux Toolkit(RTK)は、Redux ロジックを記述するための公式かつ意見の強い方法です。通常の Redux に必要なボイラープレートをなくし、アクションタイプ文字列の手動管理、冗長な reducer、複雑な store のセットアップが不要になります。

Redux Toolkit のインストール

RTK と React バインディングの両方をインストールしてください。

npm install @reduxjs/toolkit react-redux

createSlice — State + Reducer + Actions

createSlice は、1 回の呼び出しで state の slice と、その reducer および action creator を作成します。内部では Immer を使用して不変更新を実現しています。

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

const counterSlice = createSlice({
  name: 'counter',
  initialState: { value: 0 },
  reducers: {
    increment: state => { state.value++; },     // Immer: mutate directly
    decrement: state => { state.value--; },
    reset: state => { state.value = 0; },
    incrementBy: (state, action) => { state.value += action.payload; }
  }
});

export const { increment, decrement, reset, incrementBy } = counterSlice.actions;
export default counterSlice.reducer;

configureStore — Store の組み立て

configureStore は、適切なデフォルト設定で Redux store を作成します。Redux DevTools が有効になり、thunk middleware も含まれます。

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

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

// TypeScript types:
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;

Store の提供

react-redux の <Provider store={store}> でアプリをラップします。

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

ReactDOM.createRoot(document.getElementById('root')!).render(
  <Provider store={store}>
    <App />
  </Provider>
);

useSelector — State の読み取り

useSelector(selector) は store から読み取ります。選択した slice が変更されると、コンポーネントを再レンダリングします。

import { useSelector } from 'react-redux';
import type { RootState } from './store';

function Counter() {
  const count = useSelector((state: RootState) => state.counter.value);
  return <p>Count: {count}</p>;
}

useDispatch — Actions のディスパッチ

useDispatch() は store の dispatch 関数を返します。state を変更するには、action creator とともに呼び出します。

import { useDispatch } from 'react-redux';
import { increment, incrementBy } from './counterSlice';

function Controls() {
  const dispatch = useDispatch();
  return (
    <div>
      <button onClick={() => dispatch(increment())}>+1</button>
      <button onClick={() => dispatch(incrementBy(5))}>+5</button>
    </div>
  );
}

createAsyncThunk — 非同期 Actions

RTK の createAsyncThunk は非同期処理(API 呼び出し)を処理し、pending/fulfilled/rejected アクションを自動的にディスパッチします。

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

export const fetchUser = createAsyncThunk(
  'user/fetchById',
  async (userId: string) => {
    const res = await fetch(`/api/users/${userId}`);
    return res.json(); // becomes action.payload on fulfilled
  }
);

// In slice:
extraReducers: (builder) => {
  builder
    .addCase(fetchUser.pending, state => { state.loading = true; })
    .addCase(fetchUser.fulfilled, (state, action) => {
      state.loading = false;
      state.user = action.payload;
    });
}

RTK Query — 組み込みのデータ取得

RTK Query(RTK の一部)は、データの取得、キャッシュ、無効化を自動的に行います。API エンドポイントを定義すると、生成されたフックを利用できます。

import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';

export const api = createApi({
  baseQuery: fetchBaseQuery({ baseUrl: '/api' }),
  endpoints: (build) => ({
    getUsers: build.query<User[], void>({ query: () => 'users' }),
  })
});

// Generated hook:
const { data, isLoading, error } = api.useGetUsersQuery();

Reducer 内の Immer

RTK は内部で Immer を使用するため、slice の reducer では state を直接変更できます。Immer が変更を検出して新しい不変の state オブジェクトを生成するため、変更のような書きやすさと不変性の安全性を両立できます。

Redux DevTools

Redux DevTools のブラウザー拡張機能を使うと、ディスパッチされたすべての action、結果として得られた state、さらにタイムトラベルまで確認できます。つまり、任意の過去の state に移動できます。複雑な state の流れをデバッグするうえで非常に役立ちます。

クイックチェック

Redux Toolkit の createSlice は何を自動的に生成しますか?

まとめ: Redux Toolkit

createSlice は 1 つの定義に reducer と actions をまとめます。Immer により、state を安全に「変更」できます。configureStore は DevTools と thunk を備えた reducer を組み立てます。useSelector は state を読み取ります。useDispatch は actions をディスパッチします。非同期処理には createAsyncThunk を使用します。RTK Query はキャッシュを備えたデータ取得全体を担います。

無料で開始

AI チューターと学ぶ HTML — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
41
レッスン
163

よくある質問

「Redux Toolkit:createSlice と configureStore」レッスンは無料ですか?

はい。「Redux Toolkit:createSlice と configureStore」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Frontend Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Frontend Academyコースには全4レッスンが含まれています。

「Redux Toolkit:createSlice と configureStore」で何を学びますか?

createSlice で state のスライスを定義し、configureStore でまとめ、useDispatch と useSelector を使って React コンポーネントからアクションを dispatch します。 ブラウザで直接実行するハンズオンコードでFrontend Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Frontend Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのFrontend Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「Redux Toolkit:createSlice と configureStore」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このFrontend Academyレッスンでコードを書いて実行できますか?

はい。すべてのFrontend Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Redux Toolkit:createSlice と configureStore
  2. 軽量な React 状態管理のための Zustand
  3. Vue の Pinia:defineStore と storeToRefs
  4. グローバル状態とローカル状態の使い分け
← Frontend Academyに戻る