2017-05-12 48 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