使用中继环境进行突变

时间:2016-08-04 14:13:21

标签: react-native graphql relayjs

我正在使用Relay与React Native并在登录时遇到问题&注销。

登录或注销后,Relay会将商店与之前的用户保持一致。要解决此问题,请使用Relay.RendererRelay.Environment。在每个Renderer中,我放置Environment的单个对象。

问题是我以前对Relay.Store的对象进行了变异,如同 Relay.Store.commitUpdate(new CreateProfile(), callback)

现在它不起作用。我想这是因为Relay.Store对服务器端点一无所知。但Relay.Environment确实如此。

现在我正在使用这样的this.props.relay.commitUpdate(new CreateProfile(), callback)。当父组件被包装为Relay.Container时它非常有效,因此它在props中有中继对象。

但是,在道具中没有Relay.Containers且没有Relay对象的组件中应该怎么做?

1 个答案:

答案 0 :(得分:1)

Relay.StoreRelay.Environment的全局可访问单例实例,Relay.Store.commitUpdate()更新该全局环境中的数据。但是,由于您正在使用自己的Relay.Environment实例,要更新它,您需要使用this.props.relay.commitUpdate(),如您所述。这会更新容器呈现的环境。

如果需要从容器的子组件进行突变(未包含在Relay.Container中),有两种方法可以做到这一点。您可以简单地将relay道具传递给它们,因此在您的容器的渲染功能中,您将拥有:

<Child relay={this.props.relay} />

但是,由于这些普通组件不在中继容器中,因此他们目前不需要了解有关中继的任何信息。如果你想保持这种方式,你可以编写在容器组件中执行更新的方法,如下所示:

onCreateProfile = () => {
  this.props.relay.commitUpdate(new CreateProfile());
};

并且仅在render中将回调传递给您的子组件:

<Child onCreateProfile={this.onCreateProfile} />

如果您需要从组件层次结构中没有Relay.Container的组件进行突变,您可以在一个组件中创建Relay.Environment共享根组件更高,并使用props传递它(或使用上面显示的策略传递回调)。