【问题标题】:Angular 6 / NGRX Combine ReducersAngular 6 / NGRX 组合减速器
【发布时间】:2021-01-11 22:08:45
【问题描述】:

我正在使用带有 NgRX 4 的 Angular 6。我想组合多个减速器。

app.module.ts

  import { BrowserModule } from '@angular/platform-browser';
    import { NgModule } from '@angular/core';

    import { StoreModule } from '@ngrx/store';
    import { EffectsModule } from '@ngrx/effects';

    import { StoreDevtoolsModule } from '@ngrx/store-devtools';

    import { AppComponent } from './app.component';
    import counterEffects from './store/counter/counter.effects';

    import reducers from './store/reducers';

    @NgModule({
      declarations: [AppComponent],
      imports: [
        BrowserModule,
        StoreModule.forRoot(reducers),
        EffectsModule.forRoot([counterEffects]),
        StoreDevtoolsModule.instrument({
          maxAge: 10,
        }),
      ],
      providers: [],
      bootstrap: [AppComponent],
    })
    export class AppModule {}

reducers.ts

import { combineReducers } from '@ngrx/store';
import { reducer as counterReducer, key as counterKey } from './counter';
import { reducer as profileReducer, key as profileKey } from './profile';

const appReducer = combineReducers({
  [counterKey]: counterReducer,
  [profileKey]: profileReducer,
});

export default (state, action) => {
  if (action.type === 'REDIRECT_TO_EXTERNAL') {
    state = undefined;
  }

  return appReducer(state, action);
};

我的减速器是标准的减速器,没什么特别的。

来自 React / Redux 背景,我会像这样设置多个减速器,但是在 Angular 中,当我尝试从商店中选择时,我得到了未定义的结果。当我尝试使用开发工具查看商店时,我看不到我的任何减速器,状态只是{}

如何在 Angular 6 / NgRX 4 中设置多个减速器?

【问题讨论】:

    标签: angular redux ngrx


    【解决方案1】:
    import { ActionReducerMap } from '@ngrx/store';
    import { reducer as counterReducer, key as counterKey } from './counter';
    import { reducer as profileReducer, key as profileKey } from './profile';
    
    export interface IAppState {
      [counterKey]: any;
      [profileKey]: any;
    }
    
    export const reducers: ActionReducerMap<IAppState> = {
      [counterKey]: counterReducer,
      [profileKey]: profileReducer,
    };
    

    【讨论】:

    • 可以嵌套ActionReducerMap吗?假设我希望减速器成为其他更大减速器的一部分,该怎么做?
    • 可以按照@UdiMazor 的要求做吗?
    【解决方案2】:

    对我来说,这个博客有帮助: https://blog.strongbrew.io/combinereducers-enhanced/

    试试这个:

    export interface IAppState {
      [counterKey]: NestedType;
      [profileKey]: any;
    }
    
    export interface NestedType {
          [nestedKey1]: any;
          [nestedKey2]: any;
        }
    
    export const reducers: ActionReducerMap<IAppState> = {
      [counterKey]: combineReducers({
          [nestedKey1]: nestedKey1Reducer;
          [nestedKey2]: nestedKey2Reducer;
      }),
      [profileKey]: profileReducer,
    };
    

    【讨论】:

      猜你喜欢
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2019-01-19
      • 2017-02-26
      相关资源
      最近更新 更多