Angular ngrx减速器可改变多种状态

Angular ngrx减速器可改变多种状态,angular,ngrx,ngrx-store,Angular,Ngrx,Ngrx Store,我找不到创建可更改多个状态的缩减器的方法,API Rest返回嵌套数据,我使用normalizer库对其进行规范化。这是我的密码 Api返回数据: [ {id: 1, firstName: 'CRISTIAN', lastName: 'QUISPE', country: {id: 1, name: 'PERU'}}, {id: 2, firstName: 'ISRRAEL', lastName: 'ALCAZAR', country: {id: 10, name: 'ESPAÑA'}}

我找不到创建可更改多个状态的缩减器的方法,API Rest返回嵌套数据,我使用normalizer库对其进行规范化。这是我的密码

Api返回数据:

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

export const country = new schema.Entity('countries');
export const person = new schema.Entity('people', {
  country: country
});
模式规范化器:

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

export const country = new schema.Entity('countries');
export const person = new schema.Entity('people', {
  country: country
});
标准化数据:

应为状态树:


它应该是接收api rest数据并生成上一个状态树的缩减器。

一旦获得规范化数据,您就有两种解决方案:

  • 分派一个操作(用于ex
    updateCountriesAndPeople
    ),该操作将由
    countriesReducer
    peopleReducer
  • 分派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个分派之间的状态不一致。因此,如果您想避免这种情况,您应该使用一个名为的库。它将允许您一次分派多个操作,例如,如果您有一些选择器来构建数据,它们将只触发一次

    就我个人而言,如果我知道我可能想独立地重复使用这些小动作,有时我喜欢分割我的动作


    如果您想要非常简单的东西,请使用解决方案n°1:)。

    我认为您需要的是效果:您可能需要第三个减速机,它将使用效果向人和人发送操作country@Eeks33感谢您的建议,我已经搜索了如何使用ngrx/效果,但没有找到任何示例,你能给我一个你建议的解决方案的例子吗?添加了一个带有代码示例的答案,如果这个helpsNgrx/效果与此无关,请告诉我。是的,效果对于处理副作用非常有用(例如从API获取数据)。但是在这种情况下。。另外,我评论了你的答案,因为你最终会发现商店不一致,这是一个坏主意(如果你使用选择器会破坏你的应用程序)@Maxine谢谢你的回答。解决方案n°2运行良好,为每个实体创建2个减速机,并向每个减速机发送:store.dispatch({type:LOAD\u PERSON,payload:normalizedData.entities.people})store.dispatch({type:LOAD\u COUNTRY,payload:normalizedData.enties.countries}我刚刚尝试了第1个解决方案,效果非常好,但在大型项目中,例如,如果另一个api rest返回以下用户列表:[{id:1,用户名:'CQUISPE',person:{id:1,firstName:'CRISTIAN'},{id:2,用户名:'IALCAZAR',person:{id:2,firstName:'ISRRAEL'},]我必须创建另一个操作,如:UPDATE_USER_和_PEOPLE。我的问题是:我可以创建一个通用名称为as:UPDATE_FROM_ENTITY的操作,在所有的reduce中评估此操作,假设我将有100个实体,这可能会影响应用程序的性能。不,这很好,不会影响性能。Reducers不处理操作的将返回相同的状态。并且大对象或数组是通过引用传递的,所以这并不重要,真的:)