【问题标题】:Graphql: Is there a way to update a query with NEW fields not declared on the schema?Graphql:有没有办法用架构上未声明的新字段更新查询?
【发布时间】:2019-06-28 23:09:03
【问题描述】:

所以,我有一个会话查询,用于在登录时加载。因为负载太多了(是的,加载了大量的应用程序数据),我把这个“会话”减少了很多。但是,我现在遇到的问题是,当我进行突变时,我无法更新会话,因为似乎只有我声明的字段被更新,而突变中的其他所有内容都被忽略了。

注意:我想从客户端突变更新。

所以,我有这样的事情:

@graphql(SESSION_QUERY)
class Foo etc....

现在,此会话的架构中的数据有限,如下所示:

query Session {
  session {
    id
    user_id
    first_name
    last_name
    products {
      shoes {
        id
        sizes
      }
      pants {
        id
        sizes
      }
      shirts {
        id
        sizes
      }
    }
  }

数据量很大,所以我真的把它删减了。现在,我的突变根据用户“添加”的内容创建了一个“新”项目。

这就是问题所在,假设用户“创建了一件衬衫”,但是通过该突变,用户创建了“尺寸”、“价格”、“优惠券代码”等。所以,我想要我的“衬衫”数组在这种情况下,将更新ala..

        update: (store: ApolloStore, results: *) => {
          const data = store.readQuery({ query: SESSION_QUERY });
          const products = data.session.products[productType] || [];
          data.session.products[productType] =
          products.concat(results.data['createProductShirt']);
          store.writeQuery({ query: SESSION_QUERY, data });
        }

console.logging 在写入之前和之后确实显示了更新,但会话从未真正更新。似乎它只是被过滤以仅更新 id 和大小。我需要更新整个返回集。

基本上,当我的组件获得新道具时,突变更新不存在。

即使架构中未定义特定值,是否有办法更新此会话?

我宁愿不使用redux,而且我的使用似乎没有使用apollo-link-state(这似乎有点多)那么回避。

【问题讨论】:

    标签: graphql


    【解决方案1】:

    您不需要像那样手动更新 apollo 存储 - Apollo 缓存应该为您保存所有内容,前提是它具有在数据之间建立任何关系所需的 ID。

    您的 Apollo 缓存设置在您的客户端中是什么样的? 您是否尝试过使用Apollo Dev-tools 来查看缓存中发生了什么?

    或者reftechQueries 不足以让您更新从 Session 查询返回的数据?

    【讨论】:

    • 我还没有设置缓存,因为这看起来很重,而且我的解析器位于另一台服务器上。
    • 我说的是客户端缓存——比如内存缓存中的阿波罗
    • 正确,我没有设置。我希望我可以直接更新商店。更新缓存是否强制在反应组件中重新渲染(我需要这个)。我还没有看到解决方法。
    • 我建议设置它而不是尝试自己写入缓存 - 这会容易得多。您只需安装 1 个软件包并在客户端设置中添加一行:apollographql.com/docs/react/advanced/caching.html
    • 并回答您的另一个问题:它是否强制渲染 - 是的!它将更新任何查询组件的道具,并且它们将重新渲染。试试看 - 感觉有点像魔术
    猜你喜欢
    • 2015-12-15
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多