用Apollo取代Redux进行本地状态管理

时间:2020-05-14 11:42:03

标签: reactjs redux graphql apollo

我对GraphQL和Apollo还是很陌生,但是最近三年来我一直在将Redux和React一起使用。基于Apollo文档,他们鼓励开发人员将其用作事实的唯一来源:

我们希望能够访问布尔标志和来自的设备API结果 应用中包含多个组件,但不想维护一个单独的组件 Redux或MobX存储。理想情况下,我们希望将Apollo缓存作为 客户端应用程序中所有数据的唯一真实来源

我正在尝试找出与Apollo一起复制Redux所允许的方式。在我的应用程序中,我有“标签”,即一组对象,每个对象都有接近15个不同的字段。它们在我的应用程序的3个不同部分中使用,每个部分都显示特定的“标签”以及“标签”中的特定字段。基于此,我使用Redux处理此问题的方法是从我的API中获取“标签”,然后在reducer中,创建包含每个部分所需的特定“标签”的ID的不同数组,并且我还将创建包含原始数据的地图(ID,值)。就像这样:

const tags = new Map(); //(tagId, tag) containing all the tags
const sectionATags = []; // array of ids for section A tags
const sectionBTags = []; // array of ids for section B tags
const sectionCTags = []; // array of ids for section C tags

我的目标是复制相同的行为,但是即使它们鼓励您使用Apollo管理您的本地状态,我也不确定我想实现的目标是否可以简单的方式 ,或者使用Apollo进行良好实践。我一直在遵循文档中的this example,它们的主要作用是通过扩展查询或使用@client指令对缓存的数据进行突变,来向从服务器接收的数据添加或删除额外的字段。 / p>

同时,我了解GraphQL旨在查询所需的特定数据,而不是典型的REST请求,在该请求中,无论是否需要,您都将获得包含所有数据的大JSON,但是好像在这种情况下用我每个部分需要的特定数据进行3个不同的查询效率不高。

我不确定是否遗漏了某些东西,或者认为Apollo被认为是“更简单的本地状态管理”。我要遵循正确的路径还是应该继续将Redux与另一个GraphQL库一起使用,该库仅允许我在没有管理层的情况下获取数据?

1 个答案:

答案 0 :(得分:0)

Apollo具有标准化的缓存...您可以查询一次所有[任何地方都需要的字段]数据-后续/附加查询可以是“仅缓存”。不会再发出其他请求-如果所有必填字段均已存在,这是安全的。

转换数据结构...通常不需要,我们正在处理所需的数据[和形状](“不是后端问题”)。您可以:

  • 更改解析器中的数据形状[在使用graphql API包装REST时]
  • 重塑REST链接中的数据(来自Apollo的直接REST API访问)
  • 在启动时读取一次数据,将转换后的数据保存在本地(以下所有查询都在本地读取)

常见应用状态可以留在redux中-数据获取应在阿波罗中。