多くの減算ロジックを重複排除する必要がある地点に構築されたReact/Reduxアプリをリファクタリングしています。私はHigh Order Reducersを見てきましたが、私が彼らを私のために働かせる方法を頭に入れて苦労しています。ここで高次減算器を使用した減額アクションロジックの重複解消
は例です:
reducers.js
import components from './entities/components';
import events from './entities/events';
import items from './entities/items';
const entities = combineReducers({
components,
items,
events,
});
私はnormalizrを使用しています。私の状態がどのように見えるかの考えがあります。この例では、イベントはコンポーネントまたはアイテムに属することができることを知っていますが、それ以外の場合は区別できます。
{
entities: {
components: {
component_1: {
events: ['event_1'],
},
},
items: {
item_1: {
events: ['event_2'],
},
},
events: {
event_1: {
comment: "foo"
},
event_2: {
comment: "bar"
}
}
}
}
私はすべての3つのレデューサーにEVENT_ADD
アクションタイプを使用しています。ロジックはのcomponent.jsとitem.js(下記)と同じですが、2つのタイプもそれぞれのタイプに固有の独立したアクションを持っています。
Immutable.jsの.has()
関数を使って、間違った場所にイベントを追加すると、ターゲットIDがその部分に存在するかどうかを確認できます。
export default (state = getInitState('component'), action) => {
switch (action.type) {
case EVENT_ADD:
return state.has(action.targetId) ?
state.updateIn(
[action.targetId, 'events'],
arr => arr.push(action.event.id)
) :
state;
[...]
}
}
event.js では、私は状態のその部分にイベントの内容を追加するだけでなく、ここでEVENT_ADD
を使用しています。これは私がイベントの両方EVENT_ADD_COMPONENT
とEVENT_ADD_ITEM
を使用すること(
- 使用別々のアクションタイプ
ADD_EVENT_${entity}
:上位減速のexport default (state = getInitState('events'), action) => { switch (action.type) { case EVENT_ADD: return state.set(action.event.id, fromJS(action.event)); [...] } }
私の理解では、私は、次のいずれかまたは両方を行う必要があるということです。 js親に関係なくイベントを作成してください)
- bottom of the docsで示されているように、私の主要減速機の名前でフィルターをかけると、私のinitialStateと動作を区別する方法が分かりません私は両方のための減速剤を共有している場合、コンポーネントとアイテムに固有です。
それは私が私がADD_EVENT
のようなアクションのためのコンポーネントと項目の間のロジックを共有することができ、いくつかのsharedReducer.jsをしたいようになど、DELETE_EVET
、そうです。そしてまた、各エンティティのための2つの独立した減速を持っています。私はこれをどのように達成できるのか、どんなデザインパターンが最善であるかは分かりません。
ガイダンスをいただければ幸いです。ありがとうございました!
これは完璧です。 'reduce-reducers'は間違いなく私が心に留めていたものですが、別のパッケージの必要性を排除するための最初の提案を取り除くことができるかどうかがわかります。答える時間をとってくれてありがとう! – aesterisk