【发布时间】:2016-10-10 11:29:00
【问题描述】:
上下文:我们正在使用 React/Alt.js 构建一个复杂的 3D“模拟人生”网络应用。用户可以在 3D 场景中添加简单的对象(立方体),但更多时候他们会添加我们所谓的“预制件”,它是基于某些用户参数(长度)的几个简单对象(15 个立方体组成一个结构)的组合, 高度, ...)。
所以我们有一个包含所有简单对象的 ObjectStore,以及 PrefabStore(它只保存用户的参数来生成预制件)。
我们可以只在 React 层生成这个预制件及其对象(这样预制件渲染总是与商店中预制件的参数同步),但出于技术原因,我们需要所有这些预制件的简单对象真正存在于商店层。换句话说,我们需要在 store 中生成 prefab 的对象(ObjectStore,因为它是存储简单对象的地方)。
问题是:where(在store层),when和如何生成prefab及其所有依赖对象,以及我们应该在哪里存储生成的对象,知道:
- 当 prefab 的参数更新时,我们需要重新生成和更新对象(现有对象可以移动、旋转、完全移除)。
- 我们无法在 React 视图层计算预制件生成的对象,因为我们需要在存储层中生成这些对象(因为这些对象可以与其他对象交互,当我们生成包含所有现有对象的文件时也需要它们)。
- 生成预制件及其相关对象是一项复杂而缓慢的任务:我们不能在每次需要渲染预制件时调用此生成函数。此外,正如我在前一点中提供的那样,我们需要对生成的对象的引用,因此它们必须存在于存储中。
为了帮助理解什么是 prefab 和一个简单的object,以及为什么我们需要 prefab 的对象存在于 store 层,这里是我们应用的截图:
我的解决方案:
- 在 React 组件中即时生成预制件和依赖对象。
优点:预制渲染和依赖对象始终与预制数据同步。当 prefab 的参数更新时,React 会自动渲染 prefab 并再次生成对象。
缺点:对象并不真正存在。它们不在 ObjectStore 中,所以我无法与它们交互(显示对象列表、生成包含所有对象的文件……)。
- 生成预制件和依赖对象一次,然后用生成的对象填充依赖存储(ObjectStore、PrefabStore)。
优点:所有对象都存储在自己的 Store 中。
缺点:当您更新预制件(移动/旋转/调整大小)时,很难更新所有相关生成的对象,并且您需要 ObjectStore 中的一堆存储 lsitener 以确保对象与它们所属的预制件。
- 即时生成预制件和相关对象,但在存储中使用记忆。 优点:依赖对象始终保持同步 + 对象确实存在于 store 层中(不确定如何在两个不同的 store 中处理这种 memoization:PrefabStore 和 ObjectStore)。
缺点:我不知道如何处理两个不同存储中的记忆:预制对象的 PrefabStore(仍然具有位置/旋转属性)和生成对象的 ObjectStore。
【问题讨论】:
-
我不确定你对 Flux 的实现,但如果你使用 Redux(即使你不是),Reselect's memoized selectors 是一种有效处理计算数据的常见模式(特别是回答第 3 点)。无论您需要在哪里引用对象,都可以
import选择器。这使您的状态保持简单并优化计算。
标签: javascript reactjs flux