Поле добавления apollo-link-state со значением по умолчанию для ввода - PullRequest
0 голосов
/ 12 декабря 2018

Вот что я пытаюсь выполнить: у меня есть конечная точка API graphql, которая возвращает мне объект Project, подобный этому (удаленные несвязанные поля):

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

Я хочу использовать apollo-link-stateчтобы добавить поле на стороне клиента ко всем этим объектам запроса, например так:

{
  "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 вместо добавления его к существующему (с идентификатором):

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

когда я даю ему идентификатор, он добавляет поле «привет» к правильному проекту, но в запросах все еще отсутствует расширенное поле.И предоставление идентификатора работает только для конкретного проекта.

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

Я также попытался использовать поле typeDefs для объекта clientState, например:

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.

1 Ответ

0 голосов
/ 20 декабря 2018

Вы должны предоставить клиентский распознаватель для вашей конфигурации clientState.

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

И затем вы передадите это в свой ApolloClient, например,

const apolloClient = new ApolloClient({ clientState });
...