Class 与Reducer 中的数据转换(ngrx/redux)

Try*_*ace 5 reducers redux ngrx angular

使用 ngrx/redux,并尽可能遵循ngrx 示例应用程序。现在我在应用程序中的某个地方执行此操作:

get totalItems (): number {
   return sumBy(this._data.items, 'metadata.value');
}
Run Code Online (Sandbox Code Playgroud)

其中_data是来自远程服务器的原始异步数据,并且是User.

现在我有一些选择:

1. 创建一个类User

constructor (public _data: UserResponse) {}
Run Code Online (Sandbox Code Playgroud)

并有一些方法,例如:

get name (): string {
  return this._data.name;
}

get address (): string {
  return this._data.address;
}
Run Code Online (Sandbox Code Playgroud)

此外,还有前面提到的totalItems以及其他获得与原始数据不同的结果的快捷方式。我不喜欢的是属性的重复,以及在哪里使用这个类;

  • 我是否使用User中的类api-service,并将转换后的数据返回到模块@Effect,这反过来会触发SUCCESSFAILED操作?
  • @Effect我是否在操作触发之前 将其放入模块中?
    • 我在角度分量上使用extendsor吗?implements

另一件事是我们将转换后的数据应用于属性payload,这将使调试原始远程数据变得困难。

2. 另一种选择是在以下内容中转换此数据reducer

电流减速机:

case ActionTypes.FETCH_USERS_SUCCESS:
   return {
     ...state,
     users: action.payload
   };
Run Code Online (Sandbox Code Playgroud)

我能做什么:

case ActionTypes.FETCH_USERS_SUCCESS:
   return {
     ...state,
     users: action.payload.map((user) => {
        return({ 
          ...user, 
           totalItems: sumBy(user.items, 'metadata.value' });
     })
   };
Run Code Online (Sandbox Code Playgroud)

这是一种反模式还是不好的做法?因为我看到它.filter一直在示例中使用,并且我不认为总结是不纯粹的,所以支持/反对在减速器中这样做的论据是什么?这样我就可以消除对User类的需求,并将所有必要的数据加载到组件中。

并且,为了防止减速器充满大量逻辑,也许可以为此创建一个单独的减速器,它“监听”相同的操作。

选项 3:

将其放入选择器中:

export const selectUsers = createSelector(selectUsersState, (state: Userstate) => state.payload.map((a: UsersResponse) => new User(a)))
Run Code Online (Sandbox Code Playgroud)

阅读 @dan_abramov 的答案:How to putmethods to the objects in Redux state? 这意味着第二个选项对此更有意义,正如他所说:

“在 Redux 中,你实际上没有自定义模型。你的状态应该是普通对象(或不可变记录)。它们不应该有任何自定义方法。”