この記事では、create-react-app でアプリ作成後 Redux での状態管理 (stateの初期化、更新、使用)する基本的な使用例を確認することができます。
ファイル構成とパッケージをインストール
create-react-app コマンドでアプリを作成後、src フォルダ下に store フォルダと index.js ファイルを追加しました。
src//
|-- store//
| `-- index.js
|-- App.js
`-- index.js
redux と react-redux パッケージをインストールします。
npm install redux react-redux
Redux データフロー
※ Redux Application Data Flow より
store の作成
import { legacy_createStore } from 'redux';
const initialState = { count: 0 };
const reducer = (state = initialState, action) => {
switch (action.type) {
case 'inc':
return { count: state.count + 1 }
case 'dec':
return { count: state.count - 1 }
case 'multi':
return { count: state.count * action.payload }
default:
return state;
}
}
export const store = legacy_createStore(reducer);
3: state の初期化
5~16: reducer では state と action を受け取り、action のタイプを基に state の更新します。
18: store を作成します。
store を適応させる
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import { Provider } from 'react-redux';
import { store } from './store';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<Provider store={store}>
<App />
</Provider>
);
10~12: Providerコンポーネントに store を渡して、アプリコンポーネントを囲うことで、アプリコンポーネント全体から、store にアクセスすることができます。
state の使用と Action を送信
import { useSelector, useDispatch } from 'react-redux';
function App() {
const count = useSelector((state) => state.count)
const dispatch = useDispatch();
const increment = () => {
dispatch({ type: 'inc' });
}
const decrement = () => {
dispatch({ type: 'dec' });
}
const multiplication = () => {
dispatch({ type: 'multi', payload: 2 })
}
return (
<div className="App">
<p>count: {count}</p>
<button onClick={increment} > + </button>
<button onClick={decrement} > - </button>
<button onClick={multiplication}> x2 </button>
</div>
);
}
export default App;
1, 4, 21: useSelector をインポートして使用します。
5, 15~17, 24: クリックイベントなどで useDispatch で Action を送信します。store では、 action を基に state の更新が行われます。
以上です。