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

问题描述:

我在我的React/Relay应用程序中使用了一个表单来修改某些字段。每次输入新的字母时,我都不想发送服务器更新。我如何使用Relay来支持应用程序状态,而无需一直推送到服务器?在阅读了大部分的Relay文档之后,我认为必须将Relay状态基本上复制到表单的本地状态或其他Flux存储区,然后在其中更改它,然后将其提交到Relay。这似乎是很多额外的工作,但只是为了保持本地的状态。如何在不推送到服务器的情况下更新中继商店

+0

您可以设置状态的组件或使用本地存储喜欢终极版。据我所知,您不能以您描述的方式在本地更新中继商店。最近我经历了类似的情景,我很乐意予以纠正。我个人认为,当涉及表单时,不仅要保持本地状态,而且要使用本地存储保持状态(如果用户刷新页面或稍后返回完成状态),但这可能不适合你的用例在这里。 – alexi2

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


......在我看来,我有到中继的状态,以 基本上复制到自己的状态的局部状态...

我看不到的问题。 React的工作方式要求您为整个表单或每个输入单独存储state

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

您将它传递给您将其分配给state并且圆圈完成的输入。您也可以直接从props(无需将数据分配到输入state)并通过方法从输入更改表格state来输入输入。

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

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


继电器势在必行API来获取,直接添加或更新缓存,但它是比较脏,很少使用(尤其是地方国有)。它用于WebSocket等功能,您希望将更新从服务器推送到客户端并手动更新缓存。

当前中继仅用于处理服务器数据。中继2有一个本地缓存,但它还没有结束。


如果我们谈论的是不同的东西,或者你可以使用一些代码示例,让我知道。

+0

嘿,谢谢你的回答。我认为我们在谈论同样的事情,尽管我很喜欢看到'RelayFragmentName'的用法,以前没有看到过。我想我只是觉得我想直接在继电器中使用API​​并改变状态,这会以道具的形式传递一切,并让组件成为无状态。我只是不一定希望每个中继状态更改都会导致网络请求。 –

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

例如

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

太棒了!我看到回购中的功能,但是有没有关于它的文档? –

+0

@MatthewHerbst不,我无法在他们的官方文档中找到它,虽然这会起作用,但应该使用正常的组件状态,除非希望这些更改在输入更改时反映到另一个组件中。 –