首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >apollo-link-state将带有默认值的字段添加到类型

apollo-link-state将带有默认值的字段添加到类型
EN

Stack Overflow用户
提问于 2018-12-13 02:22:00
回答 1查看 383关注 0票数 2

这是我试图完成的:我有一个graphql API端点,它返回给我一个Project对象,如下所示(删除不相关的字段):

代码语言:javascript
复制
{
  "data": {
    "Project": {
      "id": "cjp4b84wkochq0167gpu8oa7h",
      "requests": [
        {
          "id": "cjpbb6jcdpwj00167y4acl5a1",
          "__typename": "Request"
        },
        {
          "id": "cjpbbhlaxpwlx01675jzfyb0j",
          "__typename": "Request"
        },
        {
          "id": "cjpbbifg7pwmg0167s0ob1bm6",
          "__typename": "Request"
        },
      ],
      "__typename": "Project"
    }
  }
}

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

代码语言:javascript
复制
{
  "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定义默认值时,如下所示:

代码语言:javascript
复制
const client = new ApolloClient({
  clientState: {
    defaults: {
      Project: {
        __typename: 'Project',
        requests: [{ __typename: 'Request', expanded: false }],
      },
    },
  },
});

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

代码语言:javascript
复制
ROOT_QUERY
  Project: Project
    requests: [Request]
      0:
        expanded: false
  Project({"id":"cjp4b84wkochq0167gpu8oa7h"}): Project
    ▾Project:cjp4b84wkochq0167gpu8oa7h

当我给它提供id时,它会将"hi“字段添加到正确的项目中,但是请求仍然缺少扩展的字段。显然,给出id只对特定的项目有效。

代码语言:javascript
复制
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字段,如下所示:

代码语言:javascript
复制
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时,我还只是个初学者。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-20 14:14:41

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

代码语言:javascript
复制
const clientState = {
  resolvers: {
    Project {
      expanded: () => false
    }
  }
}

然后你可以像这样把它传递给你的ApolloClient

代码语言:javascript
复制
const apolloClient = new ApolloClient({ clientState });
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53749124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档