2016-09-22 2 views
1

私は多くのAPIサービスを呼び出すことができるので、これらのサービスには減速機を何台も書く必要があります。下に示すように減速機の作成者を実装する方法はありますか?明示的な実装以下に相当することができReact with ReduxプロジェクトでAPIサービスコールのダイナミックリデューサクリエータを実装する方法は?

const PENDING = 'PENDING' 
const REJECTED = 'REJECTED' 
const FULFILLED = 'FULFILLED' 
const COMPANIES = 'COMPANIES' 

let createReducer = (name) => (state, action) => { 
    switch (action.type) { 
    case name + '_' + PENDING: 
     return {...state, 
     isLoading: false 
     } 
    case name + '_' + FULFILLED: 
     return {...state, 
     companies: action.payload, 
     isLoading: false 
     } 
    case name + '_' + REJECTED: 
     return {...state, 
     isLoading: false, 
     err: action.payload 
     } 
    default: 
     return state 
    } 
} 

let comapnyReducer = createReducer(COMPANIES) 

:この例の

const comapnyReducer = (state={isLoading: false}, action) => { 
switch (action.type) { 
    case 'COMPANIES_PENDING': 
    return {...state, 
     isLoading: false 
    } 
    case 'COMPANIES_FULFILLED': 
    return {...state, 
     companies: action.payload, 
     isLoading: false 
    } 
    case 'COMPANIES_REJECTED': 
    return {...state, 
     isLoading: false, 
     err: action.payload 
    } 
    default: 
    return state 
    } 
} 
+0

どのように私は見ての通りの状態が出力 –

答えて

0

目標はそれがあるかもしれないどのように説明することです。実装の詳細が異なる場合があります。

DEMO JSBIN

const PENDING = 'PENDING' 
const REJECTED = 'REJECTED' 
const FULFILLED = 'FULFILLED' 

const reducer = (state={isLoading:false}, action) => { 
    const {name, type} = action; 
    switch (type) { 
    case name + '_' + PENDING: 
     return {...state, isLoading: false } 
    case name + '_' + FULFILLED: 
     return {...state, 
     items: action.payload, 
     isLoading: false 
     } 
    case name + '_' + REJECTED: 
     return {...state, 
     isLoading: false, 
     err: action.payload 
     } 
    default: 
     return state 
    } 
} 

const entities = (state={},action)=>{ 
    if(action.name){ 
    const name = action.name.toLowerCase() 
    return {...state, [name]:reducer(state[name],action) } 
    }else{ 
    return state 
    } 
} 

動作例

{type:'COMPANIES_FULFILLED',name:'COMPANIES',payload:[1,2,3,4]} 

結果

"companies": { 
     "items": [ 
      1, 
      2, 
      3, 
      4 
     ], 
     "isLoading": false 
    }, 
    "messages": { 
     "items": [ 
      1, 
      2, 
      3, 
      4 
     ], 
     "isLoading": false 
    } 
+0

に、のように見えるべきです、あなたは実際にもう一つの属性 'name'をアクションに入れて、レデューサーがアクションタイプのconst値を計算させるようにします。私の場合、私はredux-promise-middlewareを適用したので、アクションオブジェクトのペイロードは約束で、アクションタイプは異なるAPI呼び出しフェーズで動的に変更されます。しかし、私は、減速機がなぜアクションオブジェクトの '名前'属性を認識できないのかわかりません。 –

+0

もう一つ重要なことは、もし私が正常に減速機にアクションをディスパッチすることができます、あなたのコンポーネントのいずれかの部分がエラーを満たす場合、減速機が正しく生成されない状態機械全体がどこかにつまってしまうので、だから私は、ダイナミックレデューサーを生成するこの種のアプローチがアンチパターンのようなものかどうかを再考するようになったのですか?またはより良い方法がありますか? –

+0

上記のディスパッチャ、 '' 'dispatch({type:" COMPANIES "、payload:fetch(http:// mydomain/companies /、{credentials: 'include'}))then(response => response.json()) 、名前: "COMPANIES")}) '' ' –

関連する問題