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中包含更多的信息,那么测试条件就更容易设置了。
处理调度的动作时,状态需要一些参数传递给服务,例如资源的 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中包含更多的信息,那么测试条件就更容易设置了。