GraphQL Schema 上的计算字段或使用 Apollo 客户端查询

Posted

技术标签:

【中文标题】GraphQL Schema 上的计算字段或使用 Apollo 客户端查询【英文标题】:Computed fields on a GraphQL Schema or Query with Apollo Client 【发布时间】:2019-09-28 02:21:09 【问题描述】:

我有一个 GraphQL 查询,它返回两个字段,titleDetitleFr,代表两种不同语言的帖子标题。

我想在客户端有第三个字段(因此可能定义了本地状态)以将当前语言的标题存储在title 中。然后我的应用程序应该能够始终只调用title 并获取当前语言的标题。

在 Apollo(本地状态)或 GraphQL 中是否有等效的计算字段,这将允许我调用 title,它检查在 Apollo 本地状态(所以另一个查询)中全局设置的语言环境,然后返回 titleDetitleFr 基于此?

我还没有在 GraphQL 和 Apollo 上工作那么多。我知道如何在其他本地状态管理器中解决这个问题,例如NgRx、Vuex、Redux 与 getter/selector 的概念。

我的目标是从我的应用程序组件中抽象出 titleDe/Fr 逻辑,因此它们不需要具有所有语言属性的模型,并且只能调用简化的title 属性,它将根据返回正确的字符串全局设置语言环境。

【问题讨论】:

【参考方案1】:

您可以使用 Apollo 本地状态轻松添加其他字段。来自docs:

本地解析器与远程解析器非常相似。 Apollo Client 不是将您的 GraphQL 查询发送到远程 GraphQL 端点,然后该端点针对您的查询运行解析器函数以填充并返回结果集,而是针对标有 @client 指令的任何字段运行本地定义的解析器函数。

这是一个简单的例子:

const GET_LOCALE = gql`
  query GetLocale 
    locale @client
  
`;

const client = new ApolloClient(
  cache,
  link,
  resolvers: 
    Article:  // or whatever your actual type is called
      title: (article, _args,  cache ) => 
        const  locale  = cache.readQuery( query: GET_LOCALE );
        switch (locale) 
          case 'de': return article.titleDe
          case 'fr': return article.titleFr
        
      ,
    ,
  ,
);

// Initialize the cache after creating it
cache.writeData(
  data: 
    locale: getPreferenceOrProvideDefault(),
  ,
);

这里我们也将locale 存储在本地状态中,并使用readQuery 在我们的解析器中获取它。但是,您也可以直接从其他地方(例如 localStorage)获取偏好。

请注意,您仍需要将这些字段作为查询的一部分进行请求 - 即您的 title 字段不会扩展到适当的服务器端字段集。

【讨论】:

以上是关于GraphQL Schema 上的计算字段或使用 Apollo 客户端查询的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL/Relay Schema 无法在“CreateLinkPayload”类型上查询字段“store”

AWS-LAMBDA:没有这样的文件或目录,打开 './src/graphql/schema.graphql'

使用 GraphiQL 或 GraphQL 端点生成 schema.json

importSchema GraphQL 错误:ENOENT:没有这样的文件或目录,打开“./schema.graphql”

如何向 GraphQL 添加“resolveType”?

如何在 GraphQL 中导出字段定义