【问题标题】:apollo-link-state add field with default value to typeapollo-link-state 添加具有默认值的字段以键入
【发布时间】:2019-05-13 22:02:20
【问题描述】:

这是我想要完成的任务: 我有一个 graphql API 端点,它返回一个像这样的项目对象(删除了不相关的字段):

{
  "data": {
    "Project": {
      "id": "cjp4b84wkochq0167gpu8oa7h",
      "requests": [
        {
          "id": "cjpbb6jcdpwj00167y4acl5a1",
          "__typename": "Request"
        },
        {
          "id": "cjpbbhlaxpwlx01675jzfyb0j",
          "__typename": "Request"
        },
        {
          "id": "cjpbbifg7pwmg0167s0ob1bm6",
          "__typename": "Request"
        },
      ],
      "__typename": "Project"
    }
  }
}

我想使用 apollo-link-state 向所有这些 Request 对象添加一个客户端字段,如下所示:

{
  "data": {
    "Project": {
      "id": "cjp4b84wkochq0167gpu8oa7h",
      "requests": [
        {
          "id": "cjpbb6jcdpwj00167y4acl5a1",
          "expanded": false,
          "__typename": "Request"
        },
        {
          "id": "cjpbbhlaxpwlx01675jzfyb0j",
          "expanded": false,
          "__typename": "Request"
        },
        {
          "id": "cjpbbifg7pwmg0167s0ob1bm6",
          "expanded": false,
          "__typename": "Request"
        },
      ],
      "__typename": "Project"
    }
  }
}

这将允许我从呈现这些请求的组件中删除本地状态。问题是当我为我的 ApolloClient clientState 定义默认值时,如下所示:

const client = new ApolloClient({
  clientState: {
    defaults: {
      Project: {
        __typename: 'Project',
        requests: [{ __typename: 'Request', expanded: false }],
      },
    },
  },
});

Apollo 将其添加为新的 Project 对象,而不是将其添加到现有的(具有 id 的)对象中:

ROOT_QUERY
  Project: Project
    requests: [Request]
      0:
        expanded: false
  Project({"id":"cjp4b84wkochq0167gpu8oa7h"}): Project
    ▾Project:cjp4b84wkochq0167gpu8oa7h

当我给它 id 时,它会将“hi”字段添加到正确的项目中,但请求仍然缺少扩展字段。显然,提供 id 仅适用于特定项目。

const client = new ApolloClient({
  clientState: {
    defaults: {
      'Project({"id":"cjp4b84wkochq0167gpu8oa7h"})': {
        __typename: 'Project',
        hi: true,
        requests: [{ __typename: 'Request', expanded: false }],
      },
    },
  },
});

ROOT_QUERY
  Project({"id":"cjp4b84wkochq0167gpu8oa7h"}): Project
    ▾Project:cjp4b84wkochq0167gpu8oa7h
      hi: true
      requests: [Request]
        0:▾Request:cjpbb6jcdpwj00167y4acl5a1
          ...unrelated fields
        1:▾Request:cjpbbhlaxpwlx01675jzfyb0j
        2:▾Request:cjpbbifg7pwmg0167s0ob1bm6

我也尝试在 clientState 对象上使用 typeDefs 字段,如下所示:

typeDefs: [`
  schema {
    query: RootQuery
  }

  type RootQuery {
    Project($id: ID): Project
  }

  type Project {
    id: ID!
    requests: [Request]
  }

  type Request {
    id: ID!
    expanded: Boolean
  }
`],

但这似乎并没有改变缓存上的任何东西,我不知道我是否可以给它一个这样的默认值。

也许我误解了 apollo-link-state 的工作原理(甚至 graphql 的工作原理),任何能指出我正确方向的答案都值得赞赏。当谈到 graphql 或 apollo 时,我是一个初学者。

【问题讨论】:

    标签: graphql react-apollo apollo-client apollo-link-state


    【解决方案1】:

    您需要为您的 clientState 配置提供客户端解析器。

    const clientState = {
      resolvers: {
        Project {
          expanded: () => false
        }
      }
    }
    

    然后你会像这样将它传递给你的 ApolloClient

    const apolloClient = new ApolloClient({ clientState });
    

    【讨论】:

    • 这适用于将其永久设置为 false 但我现在如何对其进行变异?我将“项目”更改为“请求:”顺便说一句。
    • 您还需要为客户端突变设置解析器。你能写出你试图应用的突变吗?
    • 我尝试了突变,它实际上可以改变缓存。我猜这个解析器只是第一次被调用?我以为它不会让我变异扩展。
    • @YunusGulcu And frix 从哪里我可以配置项目以使用 pwa 和 apollo-link-state 做出反应。能否请您指导一些链接,我可以设置整个项目。
    • @AnthonyWinzlet 以CRA 开头,然后跟随Apollo-boost
    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 2019-02-17
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多