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
,这反过来会触发SUCCESS
或FAILED
操作?@Effect
我是否在操作触发之前
将其放入模块中?extends
or吗?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 中,你实际上没有自定义模型。你的状态应该是普通对象(或不可变记录)。它们不应该有任何自定义方法。”
归档时间: |
|
查看次数: |
1588 次 |
最近记录: |