相关疑难解决方法(0)

在redux中有没有OOP的地方?

我已经使用了面向对象的编程实践已有25年了,并试图在过去的5年中转向函数式编程,但是当我尝试做一些复杂的事情时,我的脑子总是转向OOP,特别是现在ES6支持体面的OOP语法,这是我构建东西的自然方式.

我现在正在学习Redux并且我理解(参见如何将方法放在Redux状态的对象上?)将类实例放入reducers中是不行的; 并且在普通减速器状态之上计算的推荐方法是使用选择器(例如,通过重新选择).而且,当然,阵营建议过遗传组合物(https://facebook.github.io/react/docs/composition-vs-inheritance.html,阵营终极版接力类).

但React/Redux生态系统中是否存在具有方法和继承的类对象的任何位置?

我想,为了回答我自己的问题,OOP类鼓励在同一个地方添加数据属性和操作,这对于可读性很好,但不适合纯函数和不可变数据.

如果我打算使用OOP,我是否需要放弃让我的实例持续并保持状态任何时间的想法?就像,每次我想使用一个,我会从商店数据中实例化它,使用我想要的任何方法,然后扔掉它?这可能会消除使用OOP类的很多动力.但如果我保留实例,我会头疼让他们与商店保持同步.

那么,当我试图使用方法并且在我试图使用继承时总是使用合成时,总是使用选择器的答案是什么?具体来说,我的意思是存储和操作Redux存储中保存的数据以用于React组件.如果是这样,它应该放在哪里?连接到选择器?像我建议的那样立即丢弃吗?


为了清楚起见,添加我的用例:我的数据基本上是一个巨大的图形:许多对象具有许多属性和对象之间的大量关系.它只读,但很复杂.我的对象被称为"概念".

在做(可能是愚蠢的)迁移到Redux的决定之前,我使用类来构造和表示概念,概念集和概念之间的关系.我的类包括用于获取概念集的异步api逻辑,有关每个概念的信息,以及与每个概念相关的其他概念的信息.如果用户选择向下钻取,则类将递归地获取并实例化新的概念集.Redux文档推荐了嵌套数据的平面,规范化结构(http://redux.js.org/docs/recipes/reducers/NormalizingStateShape.html),这对于存储来说可能是明智的,但我的OOP模型很适合遍历部分图和东西.我很难使用可能涉及嵌套的选择器和不可变状态,可能包含循环,或者需要对更多数据进行异步调用.

我成功地使用https://redux-observable.js.org/作为api的东西.

也许@Sulthan的答案是正确的:我应该随意在我的Redux应用程序中使用OOP技术.但它似乎仍然很奇怪.我不能保留我的对象,因为如果存储更改(例如,更多数据被提取),我的对象可能会变得陈旧.如果我的对象是嵌套的,但我的存储是规范化的,那么当我需要它时,我会实例化它们(来自选择器),并确保不要让它们保持在...

oop reactjs redux reselect redux-observable

17
推荐指数
2
解决办法
3031
查看次数

在 redux / ngrx 应用程序架构中初始化模型对象的位置

背景:

团队正在使用 Angular 和用于状态管理的 @ngrx 库构建一个基于 REST 的大型 Web 应用程序。

我们希望将来自服务器的实体建模为 TypeScript 类。这些可能是:帐户、用户等

这实现了:

  • 与 API 的松散耦合;如果响应改变,只有模型必须改变
  • 封装基本功能,例如名字和姓氏的字符串连接 fullName

不确定性在于时候,应用程序的时间表时,初始化模式,电话:new Account(accountResponse)

传统逻辑建议尽早执行此操作,在服务中与检索帐户的逻辑(无论是从缓存、服务器响应等)一起使用。

this.apiService.fetch(AccountService.URL)
      .map(accounts => accounts.map((a: AccountResponse) => new Account(a)));
Run Code Online (Sandbox Code Playgroud)

此方法由 ngrx 效果调用,然后在成功响应之后,Reducer 将 Account 对象添加到存储中。

然而,这是有效的...... ngrx / redux“最佳 实践”指出,为了便于序列化以及其他原因,应该只将普通对象和原语保存在商店中。

为了遵守这个建议,初始化 Account 对象必须在更远的地方进行。在单个组件中,在状态选择器中,或者通常在使用帐户的任何地方。

这对我来说没有意义,因为原始帐户响应对象是在应用程序中传递的,这在某种程度上违背了首先将它们包装在模型中的意义。

该应用程序在结构上类似于@ngrx/example book 应用程序,鉴于其简单性,它不会将服务器响应包装在模型对象中。


问题:

  • 将初始化的类保留在商店中的不利影响是什么(除了可序列化)?

  • 如果只将普通对象保存在商店中,那么在通过应用程序的数据流中,模型class最适合初始化的位置是什么?

typescript redux ngrx angular

9
推荐指数
1
解决办法
1299
查看次数

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

使用 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: …
Run Code Online (Sandbox Code Playgroud)

reducers redux ngrx angular

5
推荐指数
0
解决办法
1588
查看次数

Redux 是否要求我们不要使用 OOP?

我有 OOP 背景,正在学习 Redux。似乎我对 Redux 了解得越多,我就越意识到它与 OOP 范式的对比是如何通过采用更多的函数式构造来实现的。

\n\n

也就是说,我从未使用过 Backbone,但我在有关从 Backbone 模型迁移的 redux 文档中遇到了这一点:

\n\n
\n

Backbone 的模型层与 Redux 有很大不同,因此我们不建议混合它们。如果可能的话,最好从头开始重写应用程序的模型层,而不是将 Backbone 连接到 Redux...

\n
\n\n

来源:\n https://github.com/reactjs/redux/blob/master/docs/recipes/MigrationToRedux.md#from-backbone

\n\n

此外,我发现最初,这只是这样写的:

\n\n
\n

抱歉,您\xe2\x80\x99需要重写您的模型层。\n它\xe2\x80\x99太不同了!

\n
\n\n

来源: https: //github.com/reactjs/redux/commit/fbe0852a25d4bf9819adfe95fef6aa6702658c07#diff-a7be1d864910aa327225143859006953R30

\n\n

Sooo...Dan 是不是说要重写模型层,因为模型(例如来自 Backbone 的模型)本质上是面向对象的,而 redux 规定了更实用的范例?

\n

oop backbone.js redux

4
推荐指数
1
解决办法
821
查看次数