Flux:如何处理生成其他依赖对象的对象

时间:2016-10-10 11:29:00

标签: javascript reactjs flux

上下文:我们正在构建一个复杂的3D"模拟人生"使用React / Alt.js的Web应用程序。用户可以在3D场景(立方体)中添加简单对象,但更多时候他们会添加我们称之为"预制&#34 ;,这是基于几个简单对象(15个立方体构成结构)的组合一些用户的参数(长度,高度,......)。

所以我们有一个包含所有简单对象的ObjectStore和PrefabStore(它只保存用户的参数以生成预制件)。

我们只能在React层中生成这个预制件及其对象(这样预制件渲染始终与商店中预制件的参数同步),但由于技术原因,我们需要所有这些预制件&#39 ;存储层中确实存在的简单对象。换句话说,我们需要在商店中生成预制对象(ObjectStore,因为它存储了简单对象)。

问题是其中(在商店图层中),何时 如何生成预制件及其所有依赖对象,以及我们应该在哪里存储生成的对象,知道:

  1. 当预制参数更新时,我们需要重新生成和更新对象(现有对象可以移动,旋转,完全删除)。
  2. 我们无法在React视图层中计算预制的生成对象,因为我们需要在商店层中生成这些对象(因为这些对象可以与其他对象交互,我们在生成文件时也需要它们包含所有现有对象。)
  3. 生成预制件及其从属对象是一项复杂而缓慢的任务:每次我们需要渲染预制件时,我们都无法调用此生成函数。此外,正如我在上一点中所做的那样,我们需要对生成的对象的引用,因此它们必须存在于商店中。
  4. 为了帮助理解什么是预制件和一个简单的对象,以及为什么我们需要预制件的对象存在于商店层中,这里有一个我们的应用截图: enter image description here

    我的解决方案

    1. 在React组件中即时生成预制和依赖对象。
    2. 优点:预制渲染和依赖对象始终与预制数据同步。当预制的参数更新时,React会自动渲染预制并再次生成对象。

      缺点:对象确实不存在。它们不在ObjectStore中,因此我无法与它们交互(显示对象列表,生成包含所有对象的文件,......)。

      1. 生成预制件和从属对象一次,然后使用生成的对象填充依赖存储(ObjectStore,PrefabStore)。
      2. 优点:所有对象都存储在自己的商店中。

        缺点:更新预制件(移动/旋转/调整大小)时,很难更新所有相关生成的对象,并且在ObjectStore中需要一堆商店lsitener来确保对象与他们所属的预制件同步。

        1. 即时生成预制件和相关对象,但在具有memoization的商店中。 优点:依赖对象始终处于同步状态+对象确实存在于存储层中(不确定如何在两个不同的存储中处理此存储:PrefabStore和ObjectStore)。
        2. 缺点:我不知道如何在两个不同的商店中处理备忘:PrefabStore用于预制对象(仍然具有位置/旋转属性)和ObjectStore用于生成的对象。

1 个答案:

答案 0 :(得分:1)

回答这些架构问题很棘手 - 你是自己系统和领域的专家,但无论如何都要进行:

基本流量规则是Store负责在响应Action时改变自己的状态。此外,还有良好的通用代码组织实践,例如具有低耦合和高内聚等等。

一种选择是:

  1. 某种Prefab模型对象,它知道参数 单个预制'模板',并有一个生成方法来创建和返回 适当的对象(也许生成方法必须采取一些位置信息或某些东西作为参数)。预制模型可以在单独的代码模块中与任何商店分离。如果你愿意,generate方法可以是一个纯函数,在它自己的模块中。

  2. Prefab Store可以直接存储预制模型(可能最简单),也可以只存储构建它们所需的数据。

  3. Object Store有一个ADD_FROM_PREFAB Action的处理程序,用于查询Prefab存储以获取相应的Prefab模型数据/实例,调用 生成并最终将返回的对象添加到其状态。

  4. 用户界面然后只是从ObjectStore渲染场景,而不是预制商店(虽然可能是Prefab商店也用于预制库UI?)

  5. 使用这种方法,您可以单独测试预制模型和对象生成,并在您想要的地方重复使用。商店代码也是相当简单的胶​​水,易于测试。 UI不需要担心渲染部分中的预制件。