Graphql apollo链接状态将具有默认值的字段添加到类型

Graphql apollo链接状态将具有默认值的字段添加到类型,graphql,react-apollo,apollo-client,apollo-link-state,Graphql,React Apollo,Apollo Client,Apollo Link State,以下是我试图实现的目标: 我有一个graphql API端点,它会像这样返回一个项目对象(删除了不相关的字段): 我想使用apollo链接状态向所有这些请求对象添加一个客户端字段,如下所示: { "data": { "Project": { "id": "cjp4b84wkochq0167gpu8oa7h", "requests": [ { "id": "cjpbb6jcdpwj00167y4acl5a1",

以下是我试图实现的目标: 我有一个graphql API端点,它会像这样返回一个项目对象(删除了不相关的字段):

我想使用apollo链接状态向所有这些请求对象添加一个客户端字段,如下所示:

{
  "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"
    }
  }
}
typeDefs: [`
  schema {
    query: RootQuery
  }

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

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

  type Request {
    id: ID!
    expanded: Boolean
  }
`],
这将允许我从呈现这些请求的组件中删除本地状态。问题是,当我为Apollo客户端clientState定义默认值时,如下所示:

const client = new ApolloClient({
  clientState: {
    defaults: {
      Project: {
        __typename: 'Project',
        requests: [{ __typename: 'Request', expanded: false }],
      },
    },
  },
});
Apollo将其添加为新项目对象,而不是将其添加到现有项目对象(具有id):

当我给它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字段,如下所示:

{
  "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"
    }
  }
}
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,我是个初学者。

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

const clientState = {
  resolvers: {
    Project {
      expanded: () => false
    }
  }
}
然后你会像这样把这个传给你的客户

const apolloClient = new ApolloClient({ clientState });

这对将其永久设置为false很有效,但我现在如何对其进行变异?我将“Project”改为“Request:”顺便说一句,您还需要为客户端设置解析器。你能写出你想应用的变异吗?我试过变异,它实际上能使缓存变异。我猜这个解析器只是第一次被调用?我想它不会让我变异。@YunusGulcu和frix,从那里我可以配置项目,使其与pwa和阿波罗链接状态反应。你能帮我找到一些链接吗?我可以设置整个项目。@AnthonyWinzlet从这个开始,然后按照这个开始