我应该在哪里放置旨在转换ngrx商店的数据的业务逻辑:效果还是减少?

bal*_*teo 10 redux ngrx ngrx-effects

我的问题涉及ngrx 效应减速器.

在将它放入ngrx存储之前,我需要转换从后端检索的数据.从后端检索的数据是一个普通数组Message(Message在我的应用程序中是一个自定义类型):

Message[]
Run Code Online (Sandbox Code Playgroud)

我需要将数组转换为以下内容:

Map<string, Message[]>
Run Code Online (Sandbox Code Playgroud)

基本上我是按对方(收件人或发件人)ID(密钥)对用户的邮件进行分组.

我不知道从哪里执行转换Message[]Map<string, Message[]>:我应该把转型业务逻辑到@Effect或进入减速功能

Jul*_*ian 8

我这样做的方法是像过去一样在服务中获取和转换数据。

效果对动作做出反应,并通过服务进行调用以取回数据并根据收到的响应调度其他动作。

这使得测试更容易,因为服务与主要目的是对某个动作做出反应的效果分开,而不是打包数据。

Reducer 可用于此目的,但为了可读性,您应该再次保持清洁


car*_*ant 6

转换可以进入效果器或简化器。

如果需要执行任何验证,则将其生效-在该选项中,我可以选择调度错误操作。

否则,我会将其放入化简器中,因为这通常是将操作有效负载转换为状态的地方。

还有另一个选择:您可以使用选择器。也就是说,消息可以作为简单数组存储在状态中,并且可以使用选择器来转换状态的消息,按交易对手或其他方式对消息进行分组。如果我有多种分组消息的方法,则选择该选项。

@ngrx/example-app包含的一些例子选择

/**
 * 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
Run Code Online (Sandbox Code Playgroud)