NGXS触发action后settings状态未更新drawerExpandedState问题
问题产生原因
核心错误是Action处理函数的参数取值不符合NGXS的约定:
@Action装饰器修饰的状态处理方法,第二个参数接收的是派发的Action类完整实例,不是Action payload内的单个字段值。- 你当前代码里把第二个参数定义为
expandedState: boolean,但实际运行时这个参数拿到的是DrawerOpenState的实例,结构为{ payload: { expandedState: boolean } },根本不是布尔类型。 - 你把整个Action实例作为值传给
drawerExpandedState字段,相当于给布尔类型的状态字段赋值了一个复杂对象,NGXS执行状态更新时无法生成正确的新状态,因此不会触发状态变更,Redux DevTools也抓不到对应的更新记录。
额外排查点:如果修正参数后仍不生效,检查SettingsState是否已经通过NgxsModule.forRoot([SettingsState])(根模块)或NgxsModule.forFeature([SettingsState])(特性模块)正确注册,未被NGXS托管的状态会出现Action触发但状态不更新的问题。
修复方案
两种正确写法二选一即可,首先确保用到的操作符已经正确导入:
- 使用
patch运算符的写法(需要从@ngxs/store/operators导入patch)
@Action(DrawerOpenState) drawerOpenState(ctx: StateContext<SettingsStateModel>, action: DrawerOpenState) { ctx.setState( patch({ drawerExpandedState: action.payload.expandedState }) ); }
- 使用对象展开的原生写法(不需要额外导入操作符)
@Action(DrawerOpenState) drawerOpenState(ctx: StateContext<SettingsStateModel>, action: DrawerOpenState) { const state = ctx.getState(); ctx.setState({ ...state, drawerExpandedState: action.payload.expandedState }); }
内容的提问来源于stack exchange,提问作者Ursus Schneider
相关产品推荐
相关产品推荐

