我的问题涉及ngrx 效果和 reducer 。
在将数据放入ngrx存储之前,我需要转换从后端检索到的数据。从后端检索的数据是Message
的简单数组(Message
是我的应用程序中的自定义类型):
Message[]
我需要将数组转换为以下内容:
Map<string, Message[]>
基本上我是按对方(收件人或发件人)ID(密钥)对用户的邮件进行分组。
我不确定在何处执行从Message[]
到Map<string, Message[]>
的转换:我应该将转换业务逻辑放入 @Effect 还是转换为 reducer功能
答案 0 :(得分:5)
转换可以进入效果或减速器。
如果有任何需要执行的验证,我会将其付诸实施 - 我可以选择调度错误操作。
否则,我会将它放入reducer中,因为我通常会将动作有效负载转换为状态。
还有另一种选择:你可以使用选择器。也就是说,消息可以作为简单数组存储在状态中,并且可以使用选择器来转换状态消息,通过交易对象对其进行分组 - 或者其他。如果我有多种方式对邮件进行分组,这是我选择的选项。
@ngrx/example-app
包含selectors的一些示例:
/**
* A selector function is a map function factory. We pass it parameters and it
* returns a function that maps from the larger state tree into a smaller
* piece of state. This selector simply selects the `books` state.
*
* Selectors are used with the `select` operator.
*
* ```ts
* class MyComponent {
* constructor(state$: Observable<State>) {
* this.booksState$ = state$.select(getBooksState);
* }
* }
* ```
*/
export const getBooksState = (state: State) => state.books
答案 1 :(得分:3)
我这样做的方法是在服务中获取和转换数据,就像过去一样。
效果对某个操作做出反应,并通过该服务进行调用以获取数据,并根据收到的响应发送其他操作。
这使得测试变得更加容易,因为服务与主要目的是对某个动作做出反应而不是打包数据的效果是分开的。
可以使用减速器,但为了便于阅读,你应该保持清洁
答案 2 :(得分:0)
My opinions:
Data retrieved from backend will be kept unchanged in the store.
Using selectors as your business logic (combine, transform and etc.) for the dumb components.
Maybe the only transformation is to use normalizr to flat the data.