📔

Redux Toolkit 備忘録

2024/01/06に公開

目的

React×TypeScriptでRedux Toolkitを使用した際の備忘録です。

1. プロジェクトの作成

npm create vite

2. Reduxのインストール

npm install @reduxjs/toolkit react-redux

3. Storeの作成

import { configureStore } from "@reduxjs/toolkit";
import { useSelector as rawUseSelector, TypedUseSelectorHook } from 'react-redux';

export const store = configureStore({
  reducer: {
  }
})

export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
export const useSelector: TypedUseSelectorHook<RootState> = rawUseSelector;

4. Sliceの作成

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

export const counterSlice = createSlice({
    name: "counter",
    initialState: {
        count: 0,
    },
    reducers: {
        increment: (state) => {
            state.count += 1;
        },
        decrement: (state) => {
            state.count -= 1;
        },
    }
});

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

5. Storeの修正

reducerプロパティに作成したSliceを追加します。

import { configureStore } from "@reduxjs/toolkit";
import { useSelector as rawUseSelector, TypedUseSelectorHook } from 'react-redux';
import counterReducer from "./counterSlice"; // ← 追加

export const store = configureStore({
  reducer: {
    counter: counterReducer, // ← 追加
  }
})

export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
export const useSelector: TypedUseSelectorHook<RootState> = rawUseSelector;

6. Providerコンポーネントの設定

全てのコンポーネントからstoreにアクセスできるようにするため、main.tsファイルを修正します。

import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.tsx'
import './index.css'
import { Provider } from "react-redux"; // ← 追加
import { store } from "./redux/store"; // ← 追加

ReactDOM.createRoot(document.getElementById('root')!).render(
  <React.StrictMode>
    <Provider store={store}>  // ← 追加
      <App />
    </Provider>
  </React.StrictMode>,
)

7. useSelectorを使用してstateを取得

import { useSelector } from '../redux/store.ts'

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

  return (
    <>
        <h2>{count}</h2>
    </>
  )
}

export default Counter

8. useDispatchを使用してstateを更新

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

function Counter() {
  const dispatch = useDispatch();
  const incre = () => dispatch(increment());
  const decre = () => dispatch(decrement());

  return (
    <>
        <button onClick={incre}>+</button>
        <button onClick={decre}>-</button>
    </>
  )
}

export default Counter

おわりに

Redux Toolkitを使用することで以下のように異なるコンポーネントで状態を共有することが出来ました。

Discussion