热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

21分钟学apolloclient系列:apollostore存储细节

21分钟学apollo-client是一个系列,简单暴力,包学包会。搭建Apolloclient端,集成redux使用apollo-cli

21 分钟学 apollo-client 是一个系列,简单暴力,包学包会。

搭建 Apollo client 端,集成 redux
使用 apollo-client 来获取数据
修改本地的 apollo store 数据
提供定制方案

  • 请求拦截
  • 封装修改 client 的 api
    apollo store 存储细节

写入 store 的失败原因分析和解决方案

Apollo 集成 Redux 的原理

Apollo 仅仅是在 Redux 下开辟了一个 reducer,比如就叫 apollo。apollo 内部通过自己的私有 action (没有暴露给开发者)来更新这个 reducer 。
相当于这个 reducer 就是 Apollo 自己维护的 store ,它将所有通过 GraphQL query 得到的数据保存在这里。

我们只能通过以下几种办法来修改 apollo store

  • query 成功后,通过 updateQuery 回调修改 store
  • 几个有限的命令式接口
  • Mutation

第二种方式,虽然接口是命令式的,但并不是直接修改 state 的值,背后本质是在调用它内部私有的 action ,最终还是以 dispatch 的形式修改 store。只是这个过程对开发者是屏蔽的。
当然你必须提供对应的 GraphQL Schema (一段用 gql 语法描述的 query 或 fragment),最终的数据结构如果不符合 Schema ,会 静默 失败。
更具体的解释和运用,看 修改本地的 apollo store 数据 一节。

Apollo 的数据存储

可能你会问,既然 Apollo 的 store 是存在 redux 的 store 中的,自己写 reducer 去改不就好了吗?
这很容易想到,但不容易实现。

我们看看 apollo store 中数据存储的结构:

Apollo_Store_Preview.png

很像 normalizr 对不对?

简单说,apollo store 中存储的是扁平化的缓存。

当你想要直接修改 reducer 数据时,你需要

  • 手动计算出对应想去修改的 reducer 的 key
  • 当需要处理一个多层嵌套的实体时,还需要根据其嵌套的其它 __typename 找出其它嵌套的 reducer。这个过程也是递归的。

所以,手动写 reducer 去更新 apollo store 会相当麻烦。

扁平化数据

展开来说的话,Apollo 和 normalizr 之类的数据扁平化方案一样,只是一切都被自动化了,省去了你用 normalizr 手写的体力活,算是为数不多的惊喜了。

如果你没有接触过 normalizr ,那硬要用 reducer 的术语来描述的话,我们可以把 apollo 这个 reducer 视为一个 store。
在这个 store 中, 每一个存入 store 的实体都以 __typename:id 的方式单独存放到一个 reducer 中,__typename 取自于你请求时使用的 GraphQL Schema,如 UserTimeline:260
如果你从后端接收到一组 UserTimeline ,那么其中每一项都会在 store 里注册一个 reducer ,可能会出现 UserTimeline:1 ~ UserTimeline:100 的盛景。当你在别的请求中再请求到 UserTimeline:260 的时候,就直接 merge 到原有的 reducer 中。

你可能说这样很好啊,直接根据这个 key 访问对应的 state 就可以了。但问题是,凡是嵌套结构,都会被抽出来单独作为一个 reducer。
比方说,上图中 UserTimeline 包含一个 userInfo, 它的 __typenameUserInfo,那么 UserTimeline:260 下的 userInfo 中存储只是对应的 reducer 索引,形如

{ id: 'UserInfo:1004', generated: false, ...}

真实的 UserTimeline:260.userInfo 存储在一个名为 UserInfo:1004 的 reducer 中。而 UserInfo:1004 可能也并不完整,因为它内部也可能存在嵌套,也需要经历这样的一次搜寻过程。要一直递归下去,我们才能得到最终的完整数据。

id 的生成规则

Updating the Store | Apollo React Docs

根据官方文档的说法,apollo 在创建 apollo client 时,可选设置 dataIdFromObject。

const client = new ApolloClient({networkInterface,dataIdFromObject: x => `${x.__typename}:${x.id}`,
});

如果不设置 dataIdFromObject ,其默认就是 ${x.__typename}:${x.id}
如果 x 不存在 id,则可能出现 ${__typename}:${id}.${property}.${subProperty}










推荐阅读
  • 学习如逆水行舟,不进则退;只有坚持不断的学习,才能保持进步。今天给大家精心挑选的这几个优质的公众号,在行业深耕已久,相信大家 ... [详细]
  • 本文介绍了 JSON Schema 和 XML Schema 的基本概念,并详细讲解了如何使用 AJV 进行 JSON 数据校验。通过具体的示例和扩展方法,帮助读者更好地理解和应用这些工具。 ... [详细]
  • 本文详细介绍如何在Spring Boot项目中集成和使用JPA,涵盖JPA的基本概念、Spring Data JPA的功能以及具体的操作步骤,帮助开发者快速掌握这一强大的持久化技术。 ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • iOS 小组件开发指南
    本文详细介绍了iOS小部件(Widget)的开发流程,从环境搭建、证书配置到业务逻辑实现,提供了一系列实用的技术指导与代码示例。 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文详细介绍了 Java 中 org.w3c.dom.Node 类的 isEqualNode() 方法的功能、参数及返回值,并通过多个实际代码示例来展示其具体应用。此方法用于检测两个节点是否相等,而不仅仅是判断它们是否为同一个对象。 ... [详细]
  • mysql数据库json类型数据,sql server json数据类型
    mysql数据库json类型数据,sql server json数据类型 ... [详细]
  • Whathappened?WehavesomeexistingGraphQLschemathatuseslowercasedna ... [详细]
  • 我可以用单个整数查询技术字段。我将其设置为数组,并且可以使用它进行完整的C ... [详细]
  • 开发笔记:2019年13大GraphQL工具和库
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了2019年13大GraphQL工具和库相关的知识,希望对你有一定的参考价值。 ... [详细]
  • C#爬虫Fiddler插件开发自动生成代码
    哈喽^_^一般我们在编写网页爬虫的时候经常会使用到Fiddler这个工具来分析http包,而且通常并不是分析一个包就够了的,所以为了把更多的时间放在分析http包上,自动化生成 ... [详细]
  • 本文介绍了一种算法,用于在一个给定的二叉树中找到一个节点,该节点的子树包含最大数量的值小于该节点的节点。如果存在多个符合条件的节点,可以选择任意一个。 ... [详细]
  • 字符、字符串和文本的处理之Char类型
    .NetFramework中处理字符和字符串的主要有以下这么几个类:(1)、System.Char类一基础字符串处理类(2)、System.String类一处理不可变的字符串(一经 ... [详细]
author-avatar
殇者残雪_270
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有