因此,我正在使用Apollo-link-state
在React GraphQL应用程序中管理我的本地状态,我正在尝试存储全局状态下不同路径的列排序值,例如,如果您在{ {1}},您可能按/people
进行排序。理想情况下,我只查询firstName
,传递getSorting
并获得path
和column
。
由于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中进行切换,然后仅返回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;
}
并返回适当的值,而无需重复所有这些愚蠢的操作,或者仅仅是GraphQL应该如何工作?
答案 0 :(得分:0)
使用apollo-link-state
时,您可以define custom resolvers进行查询以及进行变异。这意味着您的基础数据可以只是一组首选项对象,每个首选项对象都具有三个属性: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)
}
}
},
})
很显然,如果您走这条路线,则需要相应地更新您的突变。