如何在不推送到服务器的情况下更新中继存储

时间:2016-11-14 21:17:36

标签: relayjs relay

我的React / Relay应用程序中有一个表单用于修改某些字段。每次在输入中输入新的字母时,我都不想发送服务器更新。如何在不总是推送到服务器的情况下使用Relay来支持应用程序状态?在阅读了大多数Relay文档之后,在我看来,我必须将Relay状态基本复制到我的表单的本地状态或其他一些Flux存储,处理在那里更改它,然后将其提交到Relay。为了保持当地的状态,这似乎是一项额外的工作。

2 个答案:

答案 0 :(得分:1)

中继当前版本是graphQL和React之间的粘合剂,它只处理来自服务器的数据。

  

......在我看来,我必须基本上复制中继状态   到我的形式的当地状态...

我没有看到问题。 React的工作方式,要求您​​分别为整个表单或每个输入存储state

如果添加编辑功能(渲染表单和获取数据以填充输入以供用户更改),则无论如何,所有中继数据都可在表单级别上以this.props.RelayFragmentName的形式获得。

您将其传递给输入,并将其指定给state并完成圆圈。您也可以直接从props提供输入(不将数据分配给输入state),并通过方法从输入更改表单state

现在,当用户进行更改并确认更改时,您只需再次收集所有state即可进行更改。

我认为它是一个完整的圆圈,如果设置了所有默认值,它基本上是牢不可破的。

Relay 命令式API直接获取,添加或更新缓存,但它相对较脏且很少使用(特别是对于本地状态)。它用于WebSockets等功能,您可以在其中将更新从服务器推送到客户端并手动更新缓存。

Current Relay仅适用于服务器数据。中继2有一个本地缓存,但还没有。

如果我们正在讨论不同的事情,或者你可以使用一些代码示例,请告诉我。

答案 1 :(得分:1)

在现代接力中,你可以使用commitLocalUpdate来做到这一点。

例如

onEmailChange = (email) => {
  commitLocalUpdate(environment, (proxy) => {
    const userProxy = proxy.get(this.props.user.__id);
    userProxy.setValue(email, 'email');
  });
}