【发布时间】:2018-05-06 04:12:32
【问题描述】:
我目前正面临 Meteor 和 React 的问题,我知道一些部分解决方案,但它们不起作用,而且我认为它们都没有指向正确的方向。
情况:
一切都与健身应用有关:我有一个代表客户锻炼的结构,而每个锻炼可以有定义的组数(一组是应该多久进行一次锻炼)。每个集合都有一些属性(所有用户都可以在字体端操作)。
现在我有以下带有一些映射函数的组件结构(状态属性在 {} 中):
Training {customers,exercises,datetime,otherinfos}
- Overview {customers,exercises}
exercises.map():
- Exercise {exercise,customers}
customers.map():
- Customer {exercise,customer}
exercise.sets.map()
Set {exercise, customer, set, valuesofset}
从 UI 的角度来看(反应),这一切都没有问题。
现在的想法是在培训组件中添加一个“保存”按钮。按下按钮时,我想将所有 Set-Components 的状态保存在“sets”集合中(如果它具有除默认占位符之外的其他值),同时将 Training-Component 保存在“trainings”中收藏。但培训还应包括有关集成了哪些 Set 的信息(因此至少 Set._id 在保存时应处于 Training-Component 状态。
到目前为止,我的想法如下:
从 Training 创建 refs 一直到所有 Sets,然后在按下“Save”时迭代所有 refs 并从所有 Sets 中调用“Mongo.insert”。这里我有一个问题,我不能返回插入的_id。当然,我可以在从 Set 一直到 Training 的每个组件中调用不同的函数,但 imo 这是一个溢出。
尝试通过调用嵌套函数来管理训练状态中所有集合的状态。因为我在输入上有 onChangeHandler,所以这总是会调用 Training 中的方法并检查哪个 Set 已更改,然后更改它。这种方式我试过了,但是导致性能很差。
为训练创建一个临时 ID,将其转发到集合(使用 componentWillReceiveProps 方法),当在集合中时,将具有临时 ID 的集合插入数据库中。然后接收所有带有 temp-ID 的 Sets 并使用它在数据库中添加 Training。 --> imo 非常复杂,如果没有必要,我真的不想进行数据库调用。
所以目前我不知道如何解决这个问题。我尝试将“集合”和“训练”分开的原因是通过以下事实给出的,即稍后我想在新的空集合旁边提供有关最后一个集合的信息,只要数据库中有一个。欢迎任何提示!
编辑:
正如建议的那样,也有可能用 Session 来解决问题。因此,我在 Set 中添加了以下代码:
componentDidMount() {
Tracker.autorun(() => {
Session.set(`set_${this.state.id}`, {
...this.state
});
});
}
然后我的想法是迭代所有以“set_”开头的训练中的会话密钥 - 不幸的是,没有一个函数可以保存所有密钥。
第二个想法是使用数组作为会话对的值。但是,处理响应式 Set 组件的更新是一个相当复杂的过程(从会话中复制数组,检查元素是否可用,创建新元素或更新现有元素)。
EDIT2:
我想我得到了 Session 的解决方案:
Object.getOwnPropertyNames(Session.keys)
成功获取所有 SessionKeys!感谢您的帮助!
【问题讨论】:
-
听起来你需要像
redux这样的东西来管理非本地状态。 -
感谢您的回答!不幸的是,虽然我可以在使用 Meteor 时在这里省略 redux,尤其是作为 Redux,它主要用于 UI 状态,但在我的情况下,UI 状态在没有它的情况下工作正常
标签: javascript mongodb reactjs meteor