小编典典

如何重置ngrx/store的所有状态?

all

我正在使用 Angular 2 和ngrx/store。我想在用户调度时重置整个商店状态USER_LOGOUT

我阅读了 Dan Abramov 关于如何重置 Redux 商店状态的回答?,但是我没有弄清楚如何rootReducer正确编写以及使用ngrx / store时将其放在哪里。

或者有没有其他方法可以在ngrx/store 中处理这个问题?

bootstrap(App, [
    provideStore(
      compose(
        storeFreeze,
        storeLogger(),
        combineReducers
      )({
        router: routerReducer,
        foo: fooReducer,
        bar: barReducer
      })
    )
  ]);

阅读 94

收藏
2022-03-08

共1个答案

小编典典

在 ngrx/store 4.x 中,这可以通过Meta-reducers来完成。据我了解,所有操作都经过元缩减器,然后才移交给特征缩减器。这使我们有机会首先更改/重置状态。

这是一个例子。

这是我的 metareducer 函数:如果动作是 LOGOUT 类型,则重新初始化状态。

function logout(reducer) {
  return function (state, action) {
    return reducer(action.type === LOGOUT ? undefined : state, action);
  }
}

下面你会看到 metareducer 是如何与 feature reducer 一起配置的。如果有超过 1 个元缩减器,则从右到左对它们进行评估

StoreModule.forRoot({rooms: roomReducer, user: userReducer}, {metaReducers: [logout]})

最后,我还有一个@effect 导航到登录页面

@Effect({dispatch: false}) logout: Observable<Action> = 
this.actions$.ofType(LOGOUT)
  .do(() => {
    // ... some more stuff here ...
    this.router.navigate(['/login page'])
});
2022-03-08