【问题标题】:Meteor react design - nested component: function callMeteor react设计——嵌套组件:函数调用
【发布时间】: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 状态。

到目前为止,我的想法如下:

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

  2. 尝试通过调用嵌套函数来管理训练状态中所有集合的状态。因为我在输入上有 onChangeHandler,所以这总是会调用 Training 中的方法并检查哪个 Set 已更改,然后更改它。这种方式我试过了,但是导致性能很差。

  3. 为训练创建一个临时 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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢分享这个想法!我试过了,认为这会是解决方案,不幸的是,很难获得 ID(查看更新的主帖)
  • Object.getOwnPropertyNames(Session.keys) 成功了!感谢会话提示!
  • 我只是想知道哪一个可以被认为是最佳实践?
猜你喜欢
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多