0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

REACT Redux ③ReduxのMiddlewareミドルウェア(よく使う一覧)

Posted at

Reduxのミドルウェアは、アクションがリデューサーに到達する前に、アクションを拡張したり処理したりするための機能を提供します。以下は、Reduxでよく使われるミドルウェアの一覧です。

1. redux-thunk

機能: アクションクリエーター内で非同期操作を扱うことができます。関数を返すアクションクリエーターを使用し、その中で非同期操作を実行し、操作が完了した後にアクションをディスパッチできます。

インストール:

npm install redux-thunk

使用例:

import { configureStore } from '@reduxjs/toolkit';
import thunk from 'redux-thunk';
import rootReducer from './reducers';

const store = configureStore({
  reducer: rootReducer,
  middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(thunk),
});

export default store;

2. redux-saga

機能: Generator 関数を使って副作用(非同期操作など)を管理します。redux-saga は、アクションをリッスンし、必要に応じて非同期操作を実行する強力な方法を提供します。

インストール:

npm install redux-saga

使用例:

import createSagaMiddleware from 'redux-saga';
import { configureStore } from '@reduxjs/toolkit';
import rootReducer from './reducers';
import rootSaga from './sagas';

const sagaMiddleware = createSagaMiddleware();

const store = configureStore({
  reducer: rootReducer,
  middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(sagaMiddleware),
});

sagaMiddleware.run(rootSaga);

export default store;

Saga 定義:

import { takeEvery, call, put } from 'redux-saga/effects';

function* fetchDataSaga() {
  try {
    const response = yield call(fetch, 'https://api.example.com/data');
    const data = yield response.json();
    yield put({ type: 'FETCH_DATA_SUCCESS', payload: data });
  } catch (error) {
    yield put({ type: 'FETCH_DATA_FAILURE', payload: error.message });
  }
}

export default function* rootSaga() {
  yield takeEvery('FETCH_DATA_REQUEST', fetchDataSaga);
}

3. redux-logger

機能: 各アクションと状態の変化をログに記録します。Redux アプリケーションのデバッグに非常に便利です。

インストール:

npm install redux-logger

使用例

import { configureStore } from '@reduxjs/toolkit';
import logger from 'redux-logger';
import rootReducer from './reducers';

const store = configureStore({
  reducer: rootReducer,
  middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(logger),
});

export default store;

4. redux-promise

機能: アクション内で Promise オブジェクトを扱うことができます。このミドルウェアは Promise の成功または失敗を自動的に処理します。

インストール:

npm install redux-promise

使用例:

import { configureStore } from '@reduxjs/toolkit';
import promise from 'redux-promise';
import rootReducer from './reducers';

const store = configureStore({
  reducer: rootReducer,
  middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(promise),
});

export default store;

5. redux-devtools-extension

機能: Redux DevTools 拡張と統合し、Redux ステートやアクションのリアルタイムでの表示を提供します。

インストール:

npm install redux-devtools-extension

使用例:

import { configureStore } from '@reduxjs/toolkit';
import rootReducer from './reducers';
import { composeWithDevTools } from 'redux-devtools-extension';

const store = configureStore({
  reducer: rootReducer,
  devTools: composeWithDevTools(),
});

export default store;

6. redux-immutable

機能: Redux ステートツリーを不可変にし、immutable.js と組み合わせて使用します。これにより、ステートツリーが毎回不可変であることが保証されます。

インストール:

npm install redux-immutable immutable

使用例:

import { configureStore } from '@reduxjs/toolkit';
import { combineReducers } from 'redux-immutable';
import { fromJS } from 'immutable';
import rootReducer from './reducers';

const store = configureStore({
  reducer: combineReducers({
    data: rootReducer
  }),
  preloadedState: fromJS({ /* 初期状態 */ })
});

export default store;

7. redux-observable

機能: RxJS ライブラリを使って副作用(非同期操作など)を処理します。redux-observable は、Observable を使用して非同期操作を管理します。

インストール:

npm install redux-observable rxjs

使用例:

import { createEpicMiddleware } from 'redux-observable';
import { configureStore } from '@reduxjs/toolkit';
import rootReducer from './reducers';
import rootEpic from './epics';

const epicMiddleware = createEpicMiddleware();

const store = configureStore({
  reducer: rootReducer,
  middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(epicMiddleware),
});

epicMiddleware.run(rootEpic);

export default store;

Epic 定義:

import { ofType } from 'redux-observable';
import { switchMap } from 'rxjs/operators';
import { ajax } from 'rxjs/ajax';
import { of } from 'rxjs';

const fetchDataEpic = action$ =>
  action$.pipe(
    ofType('FETCH_DATA_REQUEST'),
    switchMap(() =>
      ajax.getJSON('https://api.example.com/data').pipe(
        switchMap(response => of({ type: 'FETCH_DATA_SUCCESS', payload: response })),
        catchError(error => of({ type: 'FETCH_DATA_FAILURE', payload: error.message }))
      )
    )
  );

export default fetchDataEpic;

redux-thunk: 非同期操作を扱うためのミドルウェア。アクションクリエーター内で関数を返す。
redux-saga: Generator 関数を使って副作用を管理。
redux-logger: アクションや状態の変化をログに記録し、デバッグを支援。
redux-promise: アクション内の Promise オブジェクトを自動的に処理。
redux-devtools-extension: Redux DevTools 拡張と統合し、状態やアクションのリアルタイム表示を提供。
redux-immutable: Redux ステートツリーを不可変にする。
redux-observable: RxJS を使用して副作用を処理。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?