NGXS - 良好实践:传递服务所需的参数或从状态中获取参数?

NGXS - Good Practices: Passing service required params in action or getting it from state?

处理调度的动作时,状态需要一些参数传递给服务,例如资源的 ID 以执行动作。 我应该如何获取这些参数?

1。来自州:

  @Action(AddCartItem)
  addCartItem({ getState, patchState }: StateContext<CartStateModel>, { item }: AddCartItem) {
    const cartId = getState().cartId;
    return this.service.addCartItem(cartId, item).pipe(
      tap(item => patchState({ /* [...] */ })),
    );
  }

优点:

缺点:


2。来自行动:

  @Action(AddCartItem)
  addCartItem({ getState, patchState }: StateContext<CartStateModel>, { cartId, item }: AddCartItem {
    return this.service.addCartItem(cartId, item).pipe(
      tap(item => patchState({ /* [...] */ })),
    );
  }

优点:

缺点:


在我看来,选项 2 看起来更好,但我是否遗漏了什么?选项 2 会导致不必要的副作用吗?

我认为答案与用户故事密切相关,但我个人在我的应用程序中有两种模式……当状态只包含一个可能的操作值时,不传递它是有意义的,但是,当服务参数有 n+1 个可能的值,我在操作中传递它

不要将您的操作耦合到当前状态,因为您可能无法使用 Redux 调试器重放操作、跳过操作或回滚操作。

如果你的动作是从前一个状态的状态变化的增量运动,而不是直接依赖于前一个状态,那就更好了。

这也让测试变得更加困难,因为现在单元测试需要更多地了解预先存在的状态来测试动作。如果action在payload中包含更多的信息,那么测试条件就更容易设置了。