React-reduxは素晴らしいことです。 適切に使用すると、アプリケーションアーキテクチャが効率的になり、プロジェクト構造が読みやすくなります。 しかし、他の決定と同様に、いくつかの特徴があります。
アクションとレデューサーの説明は、そのような機能の1つです。 コード内のこれら2つのエンティティの従来の実装は、かなり時間がかかるタスクです。
古典的な実装の痛み
簡単な例:
出力には3つのファイルがあり、少なくとも次の問題があります。
- アクションの新しいチェーンを追加するだけでコードを「肥大化」させる
- アクション定数の過剰なインポート
- アクション定数名の読み取り(個別)
最適化
この例は
redux-actionsで改善できます。
import { createActions, handleActions, combineActions } from 'redux-actions' export const actions = createActions({ popups: { open: { start: () => ({ loading: true }), pending: () => ({ loading: true }), fail: (error) => ({ loading: false, error }), success: (name, data) => ({ loading: false, name, data }), }, close: { start: () => ({ loading: true }), pending: () => ({ loading: true }), fail: (error) => ({ loading: false, error }), success: (name) => ({ loading: false, name }), }, }, }).popups const initialState = { opened: [] }; export const accountsReducer = handleActions({ [ combineActions( actions.open.start, actions.open.pending, actions.open.success, actions.open.fail, actions.close.start, actions.close.pending, actions.close.success, actions.close.fail ) ]: (state, { payload: { loading } }) => ({ ...state, loading }), [combineActions(actions.open.fail, actions.close.fail)]: (state, { payload: { error } }) => ({ ...state, error }), [actions.open.success]: (state, { payload: { name, data } }) => ({ ...state, error: null, opened: [ ...(state.opened || []).filter(x => x.name !== name), { name, data } ] }), [actions.close.success]: (state, { payload: { name } }) => ({ ...state, error: null, opened: [ ...state.opened.filter(x => x.name !== name) ] }) }, initialState)
すでにはるかに優れていますが、完璧に制限はありません。
痛みを治療する
より良い解決策を探して、
LestaD habr.com/en/post/350850/#comment_10706454のコメントに
出会い 、
redux- symbioteを試してみることにしました。
これにより、不要なエンティティを削除し、コードの量を減らすことができました。
上記の例は次のようになり始めました。
長所から私たちが持っています:- すべて1つのファイルに
- 少ないコード
- アクションの構造化された表現
マイナスのうち:- IDEは常にヒントを提供するわけではありません
- コードでアクションを探すのが難しい
- アクションの名前を変更するのは難しい
短所にもかかわらず、このモジュールは私たちのプロジェクトでうまく使用されています。
良い仕事をしてくれた
LestaDに感謝します。