nomurabbitのブログ

nomurabbitのブログはITを中心にした技術ブログです。

nomurabbitのブログ

【React】Reduxで状態管理してみた【Typescript】

この記事はReduxReactアプリの状態管理をする方法を解説しています。

こんにちは!らびです。今回はReduxに関する記事です。

Reactアプリ状態管理について、一緒に勉強していきましょう。

storeとprovider

まずはstoreの作成です。@reduxjs/toolkitからインポートしたconfigureStoreを使って後述するcounterSlicestoreを紐づけています。

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

export default configureStore({
  reducer: {
    counter: counterReducer,
  },
})


ProviderAppをラップしてるジョ。

これによって各ReactコンポーネントからcounterSliceを利用できるんですね。

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import store from './components/redux/store'
import { Provider } from 'react-redux'
import reportWebVitals from './reportWebVitals';

ReactDOM.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>,
  document.getElementById('root')
);

reportWebVitals();

slice

sliceでは状態操作を定義します。今回はcounterとcounterの値を増減させるincrement、decrementをそれぞれ定義しています。

import { createSlice, Slice } from '@reduxjs/toolkit'

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

export const { increment, decrement } = counterSlice.actions

export const selectCount = (state: any) => {return state.counter.value};

export default counterSlice.reducer

component

ReactコンポーネントからcounterSliceを利用する方法です。decrement、incrementcounterSliceから直接インポートして利用します。一方でcountの値はselectCountuseSelectorに渡して取得しています。

import React from "react";
import { useSelector, useDispatch } from 'react-redux'
import { decrement, increment, selectCount } from '../components/redux/counterSlice'
import ResponsiveDrawer from '../components/layout/ResponsiveDrawer';

const Home9 = () => {
  const count = useSelector(selectCount);
  const dispatch = useDispatch();
  
  return (
    <ResponsiveDrawer>
    <div>
      <div>
        <button
          aria-label="Increment value"
          onClick={(state) => dispatch(increment(state))}
        >+</button>
        <span>{count}</span>
        <button
          aria-label="Decrement value"
          onClick={(state) => dispatch(decrement(state))}
        >-</button>
      </div>
    </div>
    </ResponsiveDrawer>
  );
}

export default Home9;

実行

実行結果は下記の通り、+ボタン、-ボタンを押すことでcountの値が変化します。

初期値
f:id:nomurabbit:20220122152107p:plain

ボタンを押した後の挙動
f:id:nomurabbit:20220122152120p:plain

まとめ

というわけで、今回はReduxによる状態管理のについて勉強してきましたが、いかがでしたでしょうか?

状況に合わせてuseContextと使い分けるのがよさそうですね。

次回もぜひご覧ください。では!

参考

Redux Toolkit Quick Start
redux.js.org