2017-05-12 81 views
1

我無法找到創建更改多個狀態的還原器的方式,API Rest返回嵌套數據,我使用normalizr庫進行了標準化。這是我的代碼。ngrx Reducer更改多個狀態

API返回數據:

[ 
    {id: 1, firstName: 'CRISTIAN', lastName: 'QUISPE', country: {id: 1, name: 'PERU'}}, 
    {id: 2, firstName: 'ISRRAEL', lastName: 'ALCAZAR', country: {id: 10, name: 'ESPAÑA'}} 
]; 

架構normalizr:

import {schema} from 'normalizr'; 

export const country = new schema.Entity('countries'); 
export const person = new schema.Entity('people', { 
    country: country 
}); 

歸一化數據:enter image description here

統計e預期: enter image description here

應該是接收api休息的數據並生成以前的狀態樹的reducer。

+0

我想你要找的是效果:https://github.com/ngrx/effects你可能需要第三個減速器,它將使用效果來向人員和國家派發動作 – Eeks33

+0

@ Eeks33謝謝你的建議,我已經搜索瞭如何處理ngrx/effects,但是我沒有找到任何示例,您能否給我一個您提出的解決方案示例? – cristianqr

+0

添加了一個代碼示例的答案,讓我知道如果這有幫助 – Eeks33

回答

1

一旦你得到了你的規範化的數據,你有2個解決方案:

  1. 派遣一個動作(前updateCountriesAndPeople)將由countriesReducerpeopleReducer
  2. 派遣2個不同的動作來處理:
    一個用於countriesReducer,姑且稱之爲updateCountries
    一個用於peopleReducer,姑且稱之爲updatePeople

首先是非常直截了當:

const updateCountriesAndPeople = 'UPDATE_COUNTRIES_AND_PEOPLE'; 

function countriesReducer(state, action) { 
    switch(action.type) { 
    case updateCountriesAndPeople: { 
     // do what you want with payload.entities.countries 
    } 
    } 
} 

function peopleReducer(state, action) { 
    switch(action.type) { 
    case updateCountriesAndPeople: { 
     // do what you want with payload.entities.people 
    } 
    } 
} 

對於解決N°2,如果你派遣2分的動作,你會在2調度之間的狀態不一致告終。因此,如果您想避免使用名爲redux-batched-actions的庫。它將允許您一次分派多個操作,例如,如果您有一些選擇器來構建數據,則它們只會觸發一次。

就個人而言,如果我知道我可能想獨立重新使用這些小動作,有時候我喜歡分割我的動作。

如果你想要一些非常簡單的東西,請採取解決方案n°1 :)。

+0

@Maxine感謝你的回答。解決方案n°2運行良好,爲每個實體創建2個reducer,以便對每個reducer進行調度: store.dispatch({type:LOAD_PERSON,payload:normalizedData.entities。人}) store.dispatch({類型:LOAD_COUNTRY,有效載荷:normalizedData.entities.countries} – cristianqr

+0

我只是試圖解決1號和它的作品完美,但關於大項目,例如,如果另一個API休息返回以下用戶列表:[{ID:1,用戶名: 'CQUISPE',人:{ID:1,姓: 'CRISTIAN'}}, {ID:2,用戶名: 'IALCAZAR',人:{ID:2,姓:「ISRRAEL」}}, ]我會創建一個類似的另一個動作:UPDATE_USER_AND_PEOPLE我的問題是:我可以用一個通用名稱等作爲創建操作:UPDATE_FROM_ENTITY並在所有減少評估這個動作,這可能影響應用程序假設我將有100個實體的業績。 – cristianqr

+0

沒有它的罰款,也不會影響性能。減速是不處理的行動將只返回相同的狀態。而b ig對象或數組通過引用傳遞,所以沒關係,真的:) – Maxime