例如,我需要一个当前日期或在reducer中打乱列表。我应该用特效吗?
@Effect()
foo$: Observable<Action> = this.actions$.pipe(
ofType('Foo'),
map(action => {
//create result with Date.now or shuffle
return {type: 'Foo_Result', payload: result}
}
)
);
这感觉太夸张了。最佳实践是什么?
我认为注释中已经提供了答案,但为了完整性,让我在这里提供一个"真实"的答案。
就像@cartant说的,你可以把这些副作用放在动作创作者身上。这些动作创作者不一定是纯粹的,这意味着你可以这样做:
const addTodo = ({
id = uuid(),
description = '',
createDate = Date.now
} = {}) => ({
type: 'ADD TODO',
payload: { id, description, createDate }
})
这样做还有一个额外的好处,那就是更容易进行测试:
- 在动作测试中,您测试
id
和createDate
是否存在,但不测试值 - 要测试减速器,可以设置这些值
addChat({id: 4654, description: 'a random todo', createDate: 111})
这就是为什么我更喜欢在动作创建者中这样做的原因,如果你喜欢,你可以在效果中这样做,但不要在reducer函数中这样做。
减速器功能必须保持纯。
欲了解更多信息,请参阅让我们聊一聊NgRx 中的动作和动作创建者