2016-08-04 3 views
4

Я использую Relay с React Native и имею проблему при входе в систему & выход из системы.Мутации с использованием среды ретрансляции

После входа в систему или выхода из системы Relay сохраняет хранилище от предыдущего пользователя. Для этого я использую Relay.Renderer и Relay.Environment. Как и в, в каждом Renderer я положил объект singleton Environment.

Проблема в том, что я ранее делал мутацию на объекте Relay.Store, как в 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 - глобально доступный экземпляр Singleton Relay.Environment и Relay.Store.commitUpdate() обновляет данные в этой глобальной среде. Но поскольку вы используете свой собственный экземпляр Relay.Environment, для его обновления вам необходимо использовать this.props.relay.commitUpdate(), как вы отметили. Это обновляет среду, в которой был обработан контейнер.

Если необходимо сделать мутации из дочерних компонентов контейнеров, которые не завернуты в Relay.Container, есть два способа сделать это. Вы могли бы просто передать relay опоры для них, так и в визуализации функции вашего контейнера вы бы:

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

Однако, поскольку эти простые компоненты не в контейнере, реле, они в настоящее время не нужно знать ничего о Relay. Если вы хотите сохранить их таким образом, вы могли бы написать метод, который делает обновление в вашем контейнере компонента, как это:

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

и только передать функцию обратного вызова для вашего ребенка компонента в render:

<Child onCreateProfile={this.onCreateProfile} /> 

Если вам нужно сделать мутацию из компонента, который не содержит Relay.Container над ним в иерархии компонентов, вы можете создать Relay.Environment в общем корневом компоненте выше и передать его с помощью реквизита (или передать обратный вызов с использованием стратегии, показанной выше).

Смежные вопросы