我正在将 Relay 与 React Native 一起使用,并且在登录和注销过程中遇到问题。
登录或注销后,Relay 保留前一个用户的商店。为了解决这个问题,我使用 Relay.Renderer
和 Relay.Environment
.就像在每个 Renderer
中一样我放了 Environment
的单例对象.
问题是我之前对 Relay.Store
的对象做了突变,如Relay.Store.commitUpdate(new CreateProfile(), callback)
.
现在它不起作用。我猜这是因为 Relay.Store
对服务器端点一无所知。但是Relay.Environment
做。
现在我正在使用这样的东西 this.props.relay.commitUpdate(new CreateProfile(), callback)
.当父组件被包装为 Relay.Container
时,它工作得很好。 ,所以它在 Prop 中有中继对象。
但是我应该在不是 Relay.Containers
的组件中做什么并且没有 Relay
Prop 中的对象?
最佳答案
Relay.Store
是 Relay.Environment
的全局可访问单例实例和 Relay.Store.commitUpdate()
更新该全局环境中的数据。但是由于您使用的是自己的 Relay.Environment
实例, 要更新它,您需要使用 this.props.relay.commitUpdate()
,正如你所指出的。这会更新渲染容器的环境。
如果需要从容器的子组件中进行更改 ,没有包裹在 Relay.Container
中,有两种方法可以做到这一点。您可以简单地通过 relay
支持它们,因此在容器的渲染功能中,您将拥有:
<Child relay={this.props.relay} />
但是,由于这些普通组件不在 Relay 容器中,因此它们目前不需要了解有关 Relay 的任何信息。如果您想保持这种状态,您可以编写在容器组件中执行更新的方法,如下所示:
onCreateProfile = () => {
this.props.relay.commitUpdate(new CreateProfile());
};
并且只在
render
中将回调传递给您的子组件:<Child onCreateProfile={this.onCreateProfile} />
如果您需要从没有
Relay.Container
的组件中进行更改在它上面的组件层次结构 完全可以创建 Relay.Environment
在更高的共享根组件中并使用 props 向下传递它(或使用上面显示的策略传递回调)。
关于react-native - 使用中继环境的突变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38769841/