我正在从apollo-link-state迁移到@apollo/client,如何在不使用cache.writeData的情况下将默认数据写入@apollo/client的InMemoryCache?
I am migrating from apollo-link-state to @apollo/client, how do I write default data to InMemoryCache of @apollo/client without using cache.writeData?
我使用 React 16.13,目前正在从 apollo-client
2.x 迁移到 @apollo/client
3.1.1。我从 packages.json
中删除了很多依赖库,因为它们中的大部分现在都可以直接从 @apollo/client
导入。一切都很顺利,直到我在从 apollo-link-state
.
迁移时扔了一块名为“删除默认值”的大石头
用@apollo/client
3.x,我们直接从@apollo/client
导入InMemoryCache
,这样就可以了。但是 withClientState
link 不再存在并且 ApolloClient
不支持本地缓存的默认值。我找不到任何涵盖此问题的指南。 There is one guide for Angular,但建议使用cache.writeData
构建缓存。唯一的问题是,在 @apollo/client
的 v3.x 中,InMemoryCache
不再有 writeData
方法。有一个 modify
方法,但使用起来也不简单,至少我没能为此目的使用它。
我有一个很大的“默认”对象:
export default {
authentication: {
__typename: 'authentication',
auth: ''
},
UserInfo: {
__typename: 'UserInfo',
employee: {
__typename: 'UserInfoEmployee',
defaultShopId: '',
id: '',
email: '',
image: {
__typename: 'image',
id: '',
url: ''
},
firstName: '',
lastName: '',
manager: '',
boss: ''
},
countryCode: '',
chainId: ''
},
defaultShop: {
__typename: 'defaultShop',
id: '',
name: '',
timeZone: null
},
locale: {
__typename: 'locale',
locale: getBrowserLocale()
},
countries: {
__typename: 'countries',
data: []
},
Products: {
__typename: 'Products',
guid: 0,
ProductTypes: {
__typename: 'ProductTypes',
TypeNumber: 0,
type: ''
},
legacyConfiguration: false,
version: '1.0.0'
},
location: {
__typename: 'location',
pathname: '',
search: '',
hash: null,
action: '',
key: null,
isQueryActive: false,
query: null
}
}
如何在不使用cache.writeData
的情况下将这些默认数据写入InMemoryCache
?
它需要使用策略来编写,cache.writeQuery在初始化时对我不起作用,
cache.policies.addTypePolicies({
Query: {
fields: {
selectedCurrency: {
read() {
return "USD";
},
},
selectedIndex: {
read() {
return 0;
},
},
bookingFlowStep: {
read() {
return '';
},
},
},
},
});
改用writeQuery
。
我相信在 v3 中,他们开始使用一种通用的方式来设置默认状态。
const query = gql`
query {
authentication @client {
id
__typename
}
...
}`
cache.writeQuery({
query,
data: {
authentication: {
__typename: 'authentication'
...
}
})
我使用 React 16.13,目前正在从 apollo-client
2.x 迁移到 @apollo/client
3.1.1。我从 packages.json
中删除了很多依赖库,因为它们中的大部分现在都可以直接从 @apollo/client
导入。一切都很顺利,直到我在从 apollo-link-state
.
用@apollo/client
3.x,我们直接从@apollo/client
导入InMemoryCache
,这样就可以了。但是 withClientState
link 不再存在并且 ApolloClient
不支持本地缓存的默认值。我找不到任何涵盖此问题的指南。 There is one guide for Angular,但建议使用cache.writeData
构建缓存。唯一的问题是,在 @apollo/client
的 v3.x 中,InMemoryCache
不再有 writeData
方法。有一个 modify
方法,但使用起来也不简单,至少我没能为此目的使用它。
我有一个很大的“默认”对象:
export default {
authentication: {
__typename: 'authentication',
auth: ''
},
UserInfo: {
__typename: 'UserInfo',
employee: {
__typename: 'UserInfoEmployee',
defaultShopId: '',
id: '',
email: '',
image: {
__typename: 'image',
id: '',
url: ''
},
firstName: '',
lastName: '',
manager: '',
boss: ''
},
countryCode: '',
chainId: ''
},
defaultShop: {
__typename: 'defaultShop',
id: '',
name: '',
timeZone: null
},
locale: {
__typename: 'locale',
locale: getBrowserLocale()
},
countries: {
__typename: 'countries',
data: []
},
Products: {
__typename: 'Products',
guid: 0,
ProductTypes: {
__typename: 'ProductTypes',
TypeNumber: 0,
type: ''
},
legacyConfiguration: false,
version: '1.0.0'
},
location: {
__typename: 'location',
pathname: '',
search: '',
hash: null,
action: '',
key: null,
isQueryActive: false,
query: null
}
}
如何在不使用cache.writeData
的情况下将这些默认数据写入InMemoryCache
?
它需要使用策略来编写,cache.writeQuery在初始化时对我不起作用,
cache.policies.addTypePolicies({
Query: {
fields: {
selectedCurrency: {
read() {
return "USD";
},
},
selectedIndex: {
read() {
return 0;
},
},
bookingFlowStep: {
read() {
return '';
},
},
},
},
});
改用writeQuery
。
我相信在 v3 中,他们开始使用一种通用的方式来设置默认状态。
const query = gql`
query {
authentication @client {
id
__typename
}
...
}`
cache.writeQuery({
query,
data: {
authentication: {
__typename: 'authentication'
...
}
})