Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 使用react navigation在graphql数据树中导航_Reactjs_React Native_Graphql_Apollo_React Apollo - Fatal编程技术网

Reactjs 使用react navigation在graphql数据树中导航

Reactjs 使用react navigation在graphql数据树中导航,reactjs,react-native,graphql,apollo,react-apollo,Reactjs,React Native,Graphql,Apollo,React Apollo,TL;DR:如何将*组件订阅到从graphql返回的树的分支 问题 我正在开发一个应用程序,一开始我们从graphql获得一个大的数据树,然后你可以在react导航屏幕的树中导航,可能会改变一些数据,这会影响树中数据的父级 我的问题是如何最好地处理应用程序中的数据,这样我们就不需要为每个导航步骤进行新的服务器往返,但仍然确保数据是同步的 现状 目前最可怕的解决方案是将数据作为导航参数发送,因此任何东西都比这更好。我们遇到了大量与不同步数据有关的错误 解决 潜在解决方案#1 一个稍微好一点的解决方

TL;DR:如何将*组件订阅到从graphql返回的树的分支

问题 我正在开发一个应用程序,一开始我们从graphql获得一个大的数据树,然后你可以在react导航屏幕的树中导航,可能会改变一些数据,这会影响树中数据的父级

我的问题是如何最好地处理应用程序中的数据,这样我们就不需要为每个导航步骤进行新的服务器往返,但仍然确保数据是同步的

现状 目前最可怕的解决方案是将数据作为导航参数发送,因此任何东西都比这更好。我们遇到了大量与不同步数据有关的错误

解决 潜在解决方案#1 一个稍微好一点的解决方案是将所有数据放在redux中,然后从那里获取数据,但当我们有Apollo时,这似乎是多余的,而且仍然可能使所有内容都很难保持最新

其他可能的解决办法 第三种解决方案是对树的所有层进行单独的查询,并可能使用
fetchPolicy='cache-only'
,但不是树中的每个节点都有一个id,**模式没有对单个节点的查询。如果是这样的话,我认为它可以防止重复获取

所以我想真正的问题是:有没有一种好方法可以从graphql返回的树的特定部分获取数据?我知道关于
client.readFragment
,但是当缓存更改时,组件不会自动更新。也许使用自定义解析器

还有一种可能性 我想另一种选择是将路径存储在组件中(例如,作为导航参数或在redux中),并通过重新选择重新构造树以便快速访问,然后在每个组件中查询整个树,并从中提取相关部分。这可能是最简单的解决方案?但感觉阿波罗已经完成了这项工作,我为什么还要再做一次呢


*不像GraphQL订阅那样订阅,只要确保Apollo缓存更新时保持同步,就像
useQuery
那样


**这不是一个问题,因为在我的情况下很容易缓解。

只是不使用基于路线的导航?将路径/应用程序状态存储在redux(或apollo本地状态)中,并有条件地呈现组件。。。规范化缓存需要id,并显示树分割点。。。和什么同步?重读的错误?将更多地存储整个树和部分更新。。。需要订阅?@xadm查看树的不同部分的屏幕在概念上非常不同,可以通过多种方式访问并通过多种方式导航,所以我认为react导航很有意义,删除它将是一个重大的重写。@xadm Id可以从多个字段生成,所以这是一个小问题。我遇到的同步问题是,在一个屏幕上更新数据并不能保证它在另一个屏幕上更新。不需要GraphQL
订阅
,只需要订阅Apollo缓存中的更新,就像你从
useQuery
中得到的一样。我想你需要ID才能使缓存更细粒度/更具反应性。。。你能找出使用codesandbox的问题吗?@xadm不,ID不相关,因为我可以使用。但是,是的,一个示例可能会有所帮助,但可能需要一些时间来设置,因为有许多相关的部分需要配置。例如,我不知道如何提供虚拟graphql数据或为此模拟服务器?只是不使用基于路线的导航?将路径/应用程序状态存储在redux(或apollo本地状态)中,并有条件地呈现组件。。。规范化缓存需要id,并显示树分割点。。。和什么同步?重读的错误?将更多地存储整个树和部分更新。。。需要订阅?@xadm查看树的不同部分的屏幕在概念上非常不同,可以通过多种方式访问并通过多种方式导航,所以我认为react导航很有意义,删除它将是一个重大的重写。@xadm Id可以从多个字段生成,所以这是一个小问题。我遇到的同步问题是,在一个屏幕上更新数据并不能保证它在另一个屏幕上更新。不需要GraphQL
订阅
,只需要订阅Apollo缓存中的更新,就像你从
useQuery
中得到的一样。我想你需要ID才能使缓存更细粒度/更具反应性。。。你能找出使用codesandbox的问题吗?@xadm不,ID不相关,因为我可以使用。但是,是的,一个示例可能会有所帮助,但可能需要一些时间来设置,因为有许多相关的部分需要配置。例如,我不知道如何提供虚拟graphql数据或为此模拟服务器?