我目前正面临Meteor和React的问题,我知道一些部分解决方案,但它们不起作用,而且它们都没有指向真正的方向。
情况:
所有这些都是关于健身应用程序:我有一个代表客户练习的结构,而每个练习可以有一定数量的集合(一组是运动应该多久进行一次)。每个集都有一些属性(所有用户都可以在font-end中操作)。
现在我有以下组件结构和一些map函数(状态属性在{}中):
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角度来看(反应)这一切都没有问题。
现在的想法是在Training组件中有一个“Save”按钮。按下按钮时,我想将所有Set-Components的状态保存在“sets”集合中(如果它具有除默认占位符之外的其他值),同时将Training-Component保存在“trainings”中采集。但是培训还应包括有关集合集合的信息(因此至少Set._id应该在保存时处于Training-Component状态。
现在我的想法到目前为止:
从训练中一直创建refs到所有集合然后,当按“Save”时迭代所有refs并从所有集合中调用“Mongo.insert”。这里我有一个问题,我无法返回插入的_id。当然,我可以在每个组件中调用一个不同的功能,从Set一直回到Training,但是imo这是一个溢出。
尝试通过调用嵌套函数来管理Training状态中所有集的状态。由于我在输入上有onChangeHandler,因此总是会在Training中调用一个方法并检查哪个集合已更改然后更改它。我试过这种方式,但它导致了非常糟糕的表现。
为Training创建临时ID,将其转发到Sets(使用componentWillReceiveProps方法),在Set中,使用temp-ID在数据库中插入Set。然后接收带有temp-ID的所有集合,并使用它在数据库中添加Training。 - >非常复杂,如果没有必要,我真的不想做数据库调用。
所以目前我不知道如何解决这个问题。我尝试分离“集合”和“训练”的原因是通过以下事实给出的:稍后我想在数据库上提供有关新空集合旁边的最后一个集合的信息。欢迎任何提示!
编辑:
正如所建议的那样,还有可能解决Session的问题。因此,我已将以下代码添加到Set:
componentDidMount() {
Tracker.autorun(() => {
Session.set(`set_${this.state.id}`, {
...this.state
});
});
}
然后,我的想法是迭代训练中以“set_”开头的所有会话密钥 - 遗憾的是,没有任何功能可以保存所有密钥。
第二个想法是使用数组作为会话对的值。但是,这是一个处理反应性Set组件更新的过程(来自会话的复制数组,检查元素是否可用,创建新元素或更新现有元素)。
EDIT2:
我想我得到了Session的解决方案:
Object.getOwnPropertyNames(Session.keys)
完成所有SessionKeys的诀窍!谢谢你的帮助!
答案 0 :(得分:1)
如果您不想在子组件中使用Redux或传递父绑定回调,您可以尝试使用Session在应用级别存储数据,可以在任何组件中访问(设置/获取)
https://docs.meteor.com/api/session.html
在您的情况下,您可以设置" Set"的值。在Session中并在Training中访问它。您可能还需要https://guide.meteor.com/react.html#using-withTracker。使用withTracker将有助于在更改任何Session变量时对数据库进行响应式更新。