我正在使用 Angular 2 和ngrx/store。我想在用户调度时重置整个商店状态USER_LOGOUT。
USER_LOGOUT
我阅读了 Dan Abramov 关于如何重置 Redux 商店状态的回答?,但是我没有弄清楚如何rootReducer正确编写以及使用ngrx / store时将其放在哪里。
rootReducer
或者有没有其他方法可以在ngrx/store 中处理这个问题?
bootstrap(App, [ provideStore( compose( storeFreeze, storeLogger(), combineReducers )({ router: routerReducer, foo: fooReducer, bar: barReducer }) ) ]);
在 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']) });