2017-03-16 37 views
3

我正在使用React和Meteor。当前用户的流星应用程序数据结构?

在顶层,我有一个MainWrapper组件。如果用户数据尚未到达,则显示加载;如果没有用户,则显示登录/注册;如果有全部用户数据,则显示实际页面。

这是为了防止使用Meteor.user()的组件,并且它在数据到达之前重新呈现之前的一小段时间内未定义。

所以,到真正的问题:

这是MainWrapper的底部。

export default createContainer(() => { 
    return { 
     user: Meteor.user(), 
    }; 
}, MainWrapper); 

每个用户帐户的文件有名字配置文件属性,朋友,通知等于是我需要周围的App这个数据相当多。

对我来说最好是将用户从MainWrapper作为道具传递下来?

或者我应该订阅每个需要它的组件的数据吗? (或者我甚至需要订阅?如果组件只有一次加载MainWrapper确保用户可用,那么我可以在没有额外开销的情况下在组件中使用Meteor.user()?)

任何帮助将不胜感激!

+0

这个问题具体到'流星',还是你只是问你需要怎么做?在'react'中正确的方法? –

回答

1

好问题!

一般来说你想知道如何管理你的应用程序状态。有州管理库(Flux,Redux等)。他们处理你的状态,你的组件订阅了状态的变化。


它是我最好的向下传递用户从MainWrapper的道具?

这样做,你必须将道具传递给每个孩子的组件。想象一下你有A→B→C→D分量。

如果您想将用户对象从A传递给D,那么您必须确保B和C同时通过。这很容易出错,因为你很容易忘记长时间传递它。然而,这里最大的问题在于你将所有组件依赖于用户对象。想象一下你想在别的地方重用B组件,但是它对用户对象是不依赖的?


如何正确管理状态,结果我的组件是可重用的?

让我们使用Redux例如(我有它的经验)。您可以将组件分为Presentational和Containers。简而言之,演示组件未订阅Store(您的州),您可以在任何地方重复使用它们。另一方面,容器组件被存储到商店中,并将道具传递给包含的子代表性组件。

这里有一些很好读取有关表象&集装箱组件:

  1. By the author of Redux
  2. Good comparision

结论

所以成分分离的思想可以流星实现了。例如,您的Meteor应用程序将充当API,而Redux将处理前端应用程序逻辑和状态。有不同的实现。这是一个good read如何将流星中的Redux集成在一起。

当然,您可以跳过Redux(或任何其他状态库)并使用Meteor工具集实现组件分离。

请记住,我的回答是反应& Redux经验丰富,给你一个通用的想法,你如何更好地组织你的组件。

0

我不认为有一个开销在客户端上调用Meteor.user()but let's double check)有一个肯定的服务器上,因为这会查询数据库,但除非你做服务器端渲染,这不是一个问题。所以,如果被定义取决于你Meteor.user()部件一旦用户加载只呈现,你可以查询Meteor.user()需要时

  • 另一种方法是使用React context来传递此信息。该文档列出了一些警告,并说这是一个实验性功能。我一直在使用它一段时间,我对它很满意。它是为了解决@Jordan提到的问题,当你有一个组件的列表必须通过父母的道具给他们的孩子。这看起来像:

export class MainWrapper extends Component { 
    // specify some properties to make available to all descendant 
    getChildContext() { 
    return { 
     currentUser: Meteor.user(), 
    }; 
    } 
} 
MainWrapper.childContextTypes = { currentUser: PropTypes.object }; 


class SomeComponent extends Component { 
    render() { 
    const user = this.context.currentUser; 
    ... 
    } 
}; 

其实我更喜欢第二种方法,因为它分离以及从数据相关的UI,使你更容易的组件来测试,例如流星上下文。这是由你自己决定是否需要减少。

更一般地,您可能希望查看分隔UI角色/数据状态角色中的反应对象的容器/组件结构。如果你这样做,你应该确保在容器部件中取出Meteor.user()。我很推荐它。 React Komposer使您可以轻松完成任务,并让您指定要在加载数据时呈现占位符组件:1,2。您可能也会对my fork感兴趣,专门处理React上下文,但与主回购并不完全一致。

相关问题