Переменная возвращает данные с местным состоянием в Аполлоне - PullRequest
0 голосов
/ 10 декабря 2018

Итак, я использую Apollo-link-state для управления своим локальным состоянием в приложении React GraphQL, я пытаюсь сохранить значения сортировки столбцов для разных путей в глобальном состоянии, например, если вы используете /peopleВы можете сортировать по firstName.В идеале я просто запросил бы getSorting, передал бы path и получил бы column и direction.

Поскольку GraphQL очень жесткий по конструкции, мне пришлось написать несколько довольно уродливыхкод:

export const GET_SORTING_PREF = gql`
    query GET_SORTING_PREF {
      sortingPrefs @client {
        assets {
          column
          direction
        }
        liabilities {
          column
          direction
        }
        reporting {
          column
          direction
        }
        people {
          column
          direction
        }
        companies {
          column
          direction
        }
      }
    }
` 

В то время как в Redux я просто пропускаю path, включаю переключатель в своем редукторе и возвращаю только column и direction.

фактическая мутация записывается примерно так (включая нулевое возвращение, чтобы не жаловаться):

  export const setSortingPref = (_, {path, column, direction}, { cache }) => {
    let { sortingPrefs } = cache.readQuery({
      query: GET_SORTING_PREF
    })

    sortingPrefs[path] = {
      column, direction
    }

    cache.writeQuery({
      query: GET_SORTING_PREF,
      data: { sortingPrefs }
    })

    return null;
  }

Есть ли хороший способ, которым я могу просто пропустить path и вернуть соответствующие значения, не всеэто тупое повторение, или это так, как GraphQL должен работать?

1 Ответ

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

Вы можете определять собственные распознаватели для запросов, а также мутации при использовании apollo-link-state.Это означает, что ваши базовые данные могут быть просто массивом объектов предпочтений, каждый из которых имеет три свойства: column, direction и path, и ваш пользовательский распознаватель может обрабатывать поиск правильного объекта на основе пути.

const stateLink = withClientState({
  cache,
  defaults: {
    sortingPrefs: [
      // defaults go here
    ]
  },
  resolvers: {
    Query: {
      // Note the difference in names between this and the default
      sortingPref: (_, { path }, { cache }) => {
        const query = `
          query GetSortingPrefs {
            sortingPrefs @client {
              column
              direction
              path
            }
          }
        `
        const sortingPrefs = cache.readQuery({ query }).sortingPrefs
        return sortingPrefs.find(p => p.path === path)
      }
    }
  },
})

Очевидно, что если вы пойдете по этому пути, вам необходимо соответствующим образом обновить вашу мутацию.

...