местное управление государством для graphql vue apollo

Я пытаюсь выполнить локальное управление государством с помощью vue apollo, но даже после выполнения документации я не получаю результата. В консоли нет ошибки, поэтому я не уверен, что не так.

Вот моя установка:

// main.js file the initializing part

const client = new ApolloClient({
  link: ApolloLink.from([
    errorLink,
    authMiddleware,
    link,
  ]),
  cache,
  typeDefs,
  resolvers,
  connectToDevTools: true,
});
// resolvers file

import gql from 'graphql-tag';

import { todoItemsQuery } from './task.queries';

export const typeDefs = gql`
  type Item {
    id: ID!
    text: String!
    done: Boolean!
  }

  type Mutation {
    changeItem(id: ID!): Boolean
    deleteItem(id: ID!): Boolean
    addItem(text: String!): Item
  }
`;


export const resolvers = {
  Mutation: {
    checkItem: (_, { id }, { cache }) => {
      const data = cache.readQuery({ query: todoItemsQuery });

      console.log('data res', data);
      const currentItem = data.todoItems.find(item => item.id === id);
      currentItem.done = !currentItem.done;
      cache.writeQuery({ query: todoItemsQuery, data });
      return currentItem.done;
    },
  },
};

//queries file

import gql from 'graphql-tag';

export const todoItemsQuery = gql`
  {
    todoItems @client {
      id
      text
      done
    }
  }
`;

export const checkItemMutation = gql`
  mutation($id: ID!) {
    checkItem(id: $id) @client
  }
`;

// component where I call it

  apollo: {
    todoItems: {
      query: todoItemsQuery
    }
  },

    checkItem(id) {
      this.$apollo
        .mutate({
          mutation: checkItemMutation,
          variables: { id }
        })
        .then(({ data }) => {
          console.log("CACHE", data);
        });
    },

У меня пустые элементы todoItem, ошибок нет.

Пожалуйста, дайте мне знать, что мне не хватает, я не понимаю какую-то концепцию, я думаю, и если есть способ использовать vuex с apollo, я тоже могу это сделать.

1 ответ

Предисловие: Я не специалист по Аполлону, только начинаю им пользоваться.

На всякий случай эти мысли могут вам помочь. Если они этого не сделают, что ж, мне очень жаль.

В main.js: документация Apollo предоставляет несколько иную настройку при использовании Apollo Boost (https://www.apollographql.com/docs/link/links/state/). На всякий случай вот как я настроил свою реализацию до сих пор.

import VueApollo from 'vue-apollo'
import ApolloClient from 'apollo-boost';
import { InMemoryCache } from 'apollo-cache-inmemory';
const cache = new InMemoryCache();

Vue.use(VueApollo)
const apolloClient = new ApolloClient({
  //...whatever you may already have,
  clientState: {
    // "defaults" is your initial state - if empty, I think it might error out when your app launches but is not hydrated yet.
    defaults: {
      todoItems: [],
    }
    cache,
    typeDefs: {...yourTypeDefs},
    resolvers: {...yourResolvers},
  },
});
const apolloProvider = new VueApollo({
  defaultClient: apolloClient,
});

В вашем typeDefs: я не вижу тип запроса для ваших todoItems:

type Query {
  todoItemsQuery: [Item]
}

В вашем компоненте: моя собственная реализация не работала, пока я не добавил метод обновления в запрос apollo:

apollo: {
  todoItems: {
    query: todoItemsQuery,
    update: data => data.todoItems
  }
},
Другие вопросы по тегам