2016-08-04 16 views
4

私はリレーネイティブでリレーを使用しており、ログイン中に問題があります&ログアウトしています。リレー環境を使用した突然変異

ログインまたはログアウト後、リレーは前のユーザーからストアを保持します。これを解決するために私はRelay.RendererRelay.Environmentを使います。のように、それぞれRenderer私はEnvironmentのシングルトンオブジェクトを入れました。

問題は私が以前にのオブジェクトに突然変異を行ったことです。 Relay.Store.commitUpdate(new CreateProfile(), callback)のようにです。

これで動作しません。これは、Relay.Storeがサーバーのエンドポイントについて何も知らないためです。しかし、Relay.Environmentはそうです。

そして今私はこのようなものを使用していますthis.props.relay.commitUpdate(new CreateProfile(), callback)。親コンポーネントがRelay.Containerとしてラップされているので、それは小道具にリレーオブジェクトを持っているので、かなりうまく動作します。

しかし、Relay.Containersではなく、Relayオブジェクトが小道具に含まれていないコンポーネントでどうすればよいですか?

答えて

1

Relay.Storeはグローバルにアクセス可能なシングルトンインスタンスRelay.Environmentで、Relay.Store.commitUpdate()はグローバル環境内のデータを更新します。しかし、あなた自身のインスタンスRelay.Environmentを使用しているので、それを更新するために、あなたが指摘したようにthis.props.relay.commitUpdate()を使用する必要があります。これは、コンテナがレンダリングされた環境を更新します。

Relay.Containerにラップされていない、というコンテナの子コンポーネントから突然変異を作成する必要がある場合は、2通りの方法があります。あなたは、単にあなたが持っているでしょう、あなたのコンテナのレンダリング機能では、それらにrelay小道具を渡すことができます。

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

をしかし、これらの平原のコンポーネントがリレーコンテナではないので、彼らが現在知っている必要はありません。リレーについては何でも。

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

のみrenderであなたの子コンポーネントへのコールバックを渡します:

<Child onCreateProfile={this.onCreateProfile} /> 
あなたが彼らにそのようにしておきたい場合は、このようなあなたのコンテナコンポーネントにアップデートを行う方法を書くことができ

コンポーネント階層の上にRelay.Containerを持たないコンポーネントから突然変異を作成する必要がある場合は、上位の共有ルートコンポーネントにRelay.Environmentを作成して、それを下に通過させます上記の戦略を使用したコールバック)。

関連する問題