阿波罗客户端从商店中删除而没有突变

Posted

技术标签:

【中文标题】阿波罗客户端从商店中删除而没有突变【英文标题】:apollo client delete from store without mutation 【发布时间】:2018-01-13 23:33:51 【问题描述】:

我需要通过 id 从本地存储中删除“记录”而不使用突变,因为服务器不支持突变。

我曾尝试像这样手动访问商店:

delete this.apolloClient.store.getState().apollo.data['1112']

这会删除记录,但是当我要求 apollo 获取项目时,它会转到服务器,就像没有缓存一样。

顺便说一句,如果我不删除我只是更新这样的原始属性之一:

this.apolloClient.store.getState().apollo.data['1112'].name = 'XXX'

然后一切正常,数据更新,apollo 继续使用缓存

我知道我应该使用突变,但我不能。

我只需要本地更新

【问题讨论】:

【参考方案1】:

我找到了 2 个解决方案:

查询:

stores 
 products 
  totalCount
  list 
  
 

**如果你知道确切的变量:**

const query = gql(query);
    const data = apolloClient.readQuery( query, variables:limit:100, offset: 0 );

    let removedProduct = _.remove(data.stores.products.list, function(product: IProduct)  return product.id === productId; )
    data.stores.products.totalCount = data.stores.products.list.length;

    apolloClient.writeQuery(
        query,
        variables:limit:100, offset: 0,
        data: data
    );

如果你想在所有地方删除

let dataStore = apolloClient.store.getState().apollo.data;
    let productsStore = dataStore[dataStore['ROOT_QUERY'].stores.id];
    let product = dataStore[productId];

    //remove product from cache index
    Object.keys(productsStore)
        .map((key: any) => dataStore[productsStore[key].id])
        .forEach((products: any) => 
            _.remove(products.list, (product) => product.id === productId);
            products.totalCount = products.list.length;
        );

    //remove product's complex fields (array/objects) from cache
    Object.keys(product).map((key: any) => 
        if (Array.isArray(product[key])) 
            return product[key].map((item) => item.id);
         else if (typeof product[key] === 'object') 
            return product[key].id;
        
        return null;
    ).forEach((productField) => 
        if (Array.isArray(productField)) 
            productField.forEach((key) => delete dataStore[key]);
         else if (productField) 
            delete dataStore[productField];
        
    );

    //remove product from cache
    delete dataStore[productId];

【讨论】:

在解决方案#1中,为什么我们需要writeQuery(),在我的情况下_.remove()就足够了。

以上是关于阿波罗客户端从商店中删除而没有突变的主要内容,如果未能解决你的问题,请参考以下文章

如何在阿波罗客户端中将突变链接在一起

如何处理阿波罗客户端上的突变错误?

Apollo 客户端调用每个突变和查询两次(React)

阿波罗 |如何从服务器通知订阅?

如何在 x 时间后重新渲染反应(突变阿波罗)

如何在使用表单组件时在 apollo-client 中链接突变