在Apollo中具有本地状态的变量返回数据

时间:2018-12-10 03:50:33

标签: reactjs graphql apollo react-apollo graphql-js

因此,我正在使用Apollo-link-state在React GraphQL应用程序中管理我的本地状态,我正在尝试存储全局状态下不同路径的列排序值,例如,如果您在{ {1}},您可能按/people进行排序。理想情况下,我只查询firstName,传递getSorting并获得pathcolumn

由于GraphQL在设计上非常严格,因此我不得不编写一些难看的代码:

direction

在Redux中,我只是跳过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 } } } ` ,在我的reducer中进行切换,然后仅返回pathcolumn

实际的变异是这样写的(包括一个空返回值,这样它不会抱怨):

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; } 并返回适当的值,而无需重复所有这些愚蠢的操作,或者仅仅是GraphQL应该如何工作?

1 个答案:

答案 0 :(得分:0)

使用apollo-link-state时,您可以define custom resolvers进行查询以及进行变异。这意味着您的基础数据可以只是一组首选项对象,每个首选项对象都具有三个属性:columndirectionpath,并且您的自定义解析器可以处理根据以下属性找到正确的对象路径。

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)
      }
    }
  },
})

很显然,如果您走这条路线,则需要相应地更新您的突变。