Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor react设计-嵌套组件:函数调用_Javascript_Mongodb_Reactjs_Meteor - Fatal编程技术网

Javascript Meteor react设计-嵌套组件:函数调用

Javascript Meteor react设计-嵌套组件:函数调用,javascript,mongodb,reactjs,meteor,Javascript,Mongodb,Reactjs,Meteor,我目前面临着Meteor and React的问题,我知道一些部分解决方案,但它们不起作用,在我看来,它们都没有指向真正的方向 情况: 所有的一切都是关于健身应用程序的:我有一个代表客户锻炼的结构,而每个锻炼都可以有一个定义数量的集合(一个集合是锻炼的频率)。每个集合都有一些属性(用户可以在字体端操作的所有属性) 现在我有了以下带有一些映射函数的组件结构(状态属性位于{}): 从UI角度(react)来看,这一切都可以正常工作 现在的想法是在训练组件中有一个“保存”按钮。按下按钮时,我希望将所有

我目前面临着Meteor and React的问题,我知道一些部分解决方案,但它们不起作用,在我看来,它们都没有指向真正的方向

情况:

所有的一切都是关于健身应用程序的:我有一个代表客户锻炼的结构,而每个锻炼都可以有一个定义数量的集合(一个集合是锻炼的频率)。每个集合都有一些属性(用户可以在字体端操作的所有属性)

现在我有了以下带有一些映射函数的组件结构(状态属性位于{}):

从UI角度(react)来看,这一切都可以正常工作

现在的想法是在训练组件中有一个“保存”按钮。按下按钮时,我希望将所有集合组件的状态保存在“集合”集合中(如果它具有默认占位符以外的值),同时将训练组件保存在“训练”集合中。但培训还应包括关于集成了哪些集合的信息(因此,至少集合id在保存时应处于培训组件状态)

现在,我的想法如下:

  • 创建从训练到所有集合的引用,然后按“保存”迭代所有引用并调用“Mongo.insert”从所有集合。这里我有一个问题,我无法返回插入的_id。当然,我可以在集合的每个组件中调用一个不同的函数,直到训练,但在我看来,这是一个溢出

  • 尝试通过调用嵌套函数来管理训练状态中所有集合的状态。由于我在输入上有onChangeHandler,这将始终在训练中调用一个方法,并检查哪个集合已更改,然后再更改。我尝试过这种方法,但它导致了非常糟糕的性能

  • 为培训创建临时ID,将其转发给集合(使用componentWillReceiveProps方法)当在集合中时,使用temp-ID将集合插入数据库中。然后接收所有具有temp-ID的集合,并使用它在数据库中添加训练。-->我非常复杂,如果没有必要,我真的不想进行数据库调用

  • 因此,目前我不知道如何解决这个问题。我之所以尝试将“集合”和“训练”分开,是因为这样一个事实,即稍后我想在数据库中的新空集合旁边提供有关最后一个集合的信息。欢迎提供任何提示


    编辑:

    正如所建议的,也有可能解决会话问题。因此,我添加了以下代码来设置:

    componentDidMount() {
        Tracker.autorun(() => {
            Session.set(`set_${this.state.id}`, {
                ...this.state
            });
        });
    } 
    
    然后,我的想法是迭代从“set_”开始的训练中的所有会话键-不幸的是,没有保存所有键的函数

    第二个想法是使用数组作为会话对的值。然而,处理反应集组件的更新(从会话复制数组、检查元素是否可用、创建新元素或更新现有元素)是一个相当复杂的过程


    编辑2:

    我想我在Session中找到了一个解决方案:

    Object.getOwnPropertyNames(Session.keys)
    

    完成了获取所有会话密钥的技巧!感谢您的帮助!

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


    在您的情况下,您可以设置“set”的值在会话中并在培训中访问它。您可能还需要。使用withTracker将有助于在任何会话变量更改时对数据库进行反应式更新。

    听起来您需要类似于
    redux
    的东西来管理非本地状态。感谢您的回答!不幸的是,我认为在使用Meteor、espe时可以省略redux尤其是Redux,它主要用于UI状态,但在我的情况下,没有它,UI状态工作得很好谢谢分享这个想法!我尝试过它,并认为它将是解决方案,不幸的是,很难获得ID(检查更新的主帖子)对象。getOwnPropertyNames(Session.keys)成功了!谢谢你的提示!我只是想知道哪一个可以被认为是最佳实践?
    Object.getOwnPropertyNames(Session.keys)