流星反应设计 - 嵌套组件:函数调用

时间:2018-05-03 15:39:59

标签: javascript mongodb reactjs meteor

我目前正面临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状态。

现在我的想法到目前为止:

  1. 从训练中一直创建refs到所有集合然后,当按“Save”时迭代所有refs并从所有集合中调用“Mongo.insert”。这里我有一个问题,我无法返回插入的_id。当然,我可以在每个组件中调用一个不同的功能,从Set一直回到Training,但是imo这是一个溢出。

  2. 尝试通过调用嵌套函数来管理Training状态中所有集的状态。由于我在输入上有onChangeHandler,因此总是会在Training中调用一个方法并检查哪个集合已更改然后更改它。我试过这种方式,但它导致了非常糟糕的表现。

  3. 为Training创建临时ID,将其转发到Sets(使用componentWillReceiveProps方法),在Set中,使用temp-ID在数据库中插入Set。然后接收带有temp-ID的所有集合,并使用它在数据库中添加Training。 - >非常复杂,如果没有必要,我真的不想做数据库调用。

  4. 所以目前我不知道如何解决这个问题。我尝试分离“集合”和“训练”的原因是通过以下事实给出的:稍后我想在数据库上提供有关新空集合旁边的最后一个集合的信息。欢迎任何提示!

    编辑:

    正如所建议的那样,还有可能解决Session的问题。因此,我已将以下代码添加到Set:

    componentDidMount() {
        Tracker.autorun(() => {
            Session.set(`set_${this.state.id}`, {
                ...this.state
            });
        });
    } 
    

    然后,我的想法是迭代训练中以“set_”开头的所有会话密钥 - 遗憾的是,没有任何功能可以保存所有密钥。

    第二个想法是使用数组作为会话对的值。但是,这是一个处理反应性Set组件更新的过程(来自会话的复制数组,检查元素是否可用,创建新元素或更新现有元素)。

    EDIT2:

    我想我得到了Session的解决方案:

    Object.getOwnPropertyNames(Session.keys)
    

    完成所有SessionKeys的诀窍!谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

如果您不想在子组件中使用Redux或传递父绑定回调,您可以尝试使用Session在应用级别存储数据,可以在任何组件中访问(设置/获取)

https://docs.meteor.com/api/session.html

在您的情况下,您可以设置" Set"的值。在Session中并在Training中访问它。您可能还需要https://guide.meteor.com/react.html#using-withTracker。使用withTracker将有助于在更改任何Session变量时对数据库进行响应式更新。