我正在从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/client3.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 中,他们开始使用一种通用的方式来设置默认状态。

Official docs

    const query = gql`
        query {
            authentication @client {
                id
                __typename
            }
            ...
        }`
    cache.writeQuery({
        query,
        data: {
            authentication: {
                __typename: 'authentication'
               ...
        }
    })