当前位置: 首页 > 知识库问答 >
问题:

中继prisma graphql更新存储

滑畅
2023-03-14

我正在努力让普里斯玛和继电器工作。这是我的回购协议:

https://github.com/jamesmbowler/prisma-relay-todo

这是一个简单的待办事项列表。我可以添加待办事项,但用户界面不会更新。当我刷新时,待办事项就在那里。

我能找到的所有更新存储的示例都对正在更新/创建的对象使用“父”。

看https://facebook.github.io/relay/docs/en/mutations.html#using-updater-and-optimisticupdater

此外,“更新程序配置”还需要“parentID”。https://facebook.github.io/relay/docs/en/mutations.html#updater-配置

来自中继运行时的RelayConnectionHandler。js备注:https://github.com/facebook/relay/blob/master/packages/relay-runtime/handlers/connection/RelayConnectionHandler.js#L232

 * store => {
 *   const user = store.get('<id>');
 *   const friends = RelayConnectionHandler.getConnection(user, 'FriendsFragment_friends');
 *   const edge = store.create('<edge-id>', 'FriendsEdge');
 *   RelayConnectionHandler.insertEdgeAfter(friends, edge);
 * }

是否可以在没有“父项”的情况下更新存储?没有父母的陪伴,我只有很多事情要做。

同样,创建记录是可行的,并给出以下响应:

{“data”:{“createTodo”:{“id”:“cjpdbivhc00050903ud6bkl3x”,“name”:“testing”,“complete”:false}}}}

这是我的更新功能

updater: store => {
          const payload = store.getRootField('createTodo');

          const conn = ConnectionHandler.getConnection(store.get(payload.getDataID()), 'Todos_todoesConnection');

          ConnectionHandler.insertEdgeAfter(conn, payload, cursor);

},

我做了一个控制台。日志(conn),它是未定义的。

请帮忙。

----编辑——多亏了丹尼斯,我认为有一个问题解决了——连接处理器(ConnectionHandler)。

但是,我仍然无法更新ui。以下是我在updater函数中尝试的内容:

const payload = store.getRootField('createTodo');
const clientRoot = store.get('client:root');
const conn = ConnectionHandler.getConnection(clientRoot, 'Todos_todoesConnection');
ConnectionHandler.createEdge(store, conn, payload, 'TodoEdge');

我也尝试过:

const payload = store.getRootField('createTodo');
const clientRoot = store.get('client:root');
const conn = ConnectionHandler.getConnection(clientRoot, 'Todos_todoesConnection');
ConnectionHandler.insertEdgeAfter(conn, payload);

我的数据形状与他们的示例不同,因为我在返回的数据中没有“todoEdge”和“node”(见上文)。

todoEdge{光标节点{完整id文本}}

如何像这样获取LinkedRecords?

const newEdge = payload.getLinkedRecord('todoEdge');

共有1个答案

闻修筠
2023-03-14

如果查询是父级,则父ID将是客户端:根。

看看这个:https://github.com/facebook/relay/blob/1d72862fa620a9db69d6219d5aa562054d9b93c7/packages/react-relay/classic/store/RelayStoreConstants.js#L18

同样在这个问题上:https://github.com/facebook/relay/issues/2157#issuecomment-385009482

创建一个constROOT_ID='Client: root';并将ROOT_ID作为您的父母ID传递。此外,检查更新程序上连接的名称,它必须与您声明查询的名称完全相同。

更新:实际上,您可以导入中继运行时的根ID

从'中继运行时'导入{ROOT_ID};

更新2:

您的编辑对我来说不是很清楚,但我会为您提供一个它应该可以工作的示例?运行突变后,您首先使用getRootField访问它的数据,就像您正在做的那样。所以,如果我有一个突变,例如:

  mutation UserAddMutation($input: UserAddInput!) {
    UserAdd(input: $input) {
      userEdge {
        node {
          name
          id
          age
        }
      }
      error
    }
  }

你会做:

const newEdge = store.getRootField('UserAdd').getLinkedRecord('userEdge');
      connectionUpdater({
        store,
        parentId: ROOT_ID,
        connectionName: 'UserAdd_users',
        edge: newEdge,
        before: true,
      });

这是一个助手函数,看起来像这样:

export function connectionUpdater({ store, parentId, connectionName, edge, before, filters }) {
  if (edge) {
    if (!parentId) {
      // eslint-disable-next-line
      console.log('maybe you forgot to pass a parentId: ');
      return;
    }

    const parentProxy = store.get(parentId);

    const connection = ConnectionHandler.getConnection(parentProxy, connectionName, filters);

    if (!connection) {
      // eslint-disable-next-line
      console.log('maybe this connection is not in relay store yet:', connectionName);
      return;
    }

    const newEndCursorOffset = connection.getValue('endCursorOffset');
    connection.setValue(newEndCursorOffset + 1, 'endCursorOffset');

    const newCount = connection.getValue('count');
    connection.setValue(newCount + 1, 'count');

    if (before) {
      ConnectionHandler.insertEdgeBefore(connection, edge);
    } else {
      ConnectionHandler.insertEdgeAfter(connection, edge);
    }
  }
}

希望有帮助:)

 类似资料:
  • 一、简介 当对PHPSSO进行修改后,执行此操作。 二、功能演示 更新应用列表缓存。如下图所示:

  • 我不明白为什么不更新我的对象。在另一个组件中,我通过调度更新状态。在此情况下(在下面的代码中),mapStateToProps类别中的代码正在更改(控制台日志显示另一个类别)。但组件并没有重播,虽然在组件中我使用了道具。类别。事件控制台。登录元素未运行 我认为,如果我更新状态,则根据该状态更新组件。它应该如何工作?它应该如何工作?它可能很有用,添加类别的项不是父项或子项,而是邻居 谢谢你解决问题。

  • 由于“需要HTTPS”错误,我最近在构建项目时遇到了问题。这个问题通过如下所述修改我的pom.xml得到了解决,添加了以下内容: 然而,为我的每个项目更新每个pom.xml是一件麻烦的事。 我尝试将相同的代码片段添加到我的settings.xml,但没有成功。 我知道更新版本的Maven解决了这个问题。然而,由于工作限制,我无法更新我的环境。 我目前已经安装了Java8和Maven,由Netbea

  • 我有一个数据已经保存在我的数据库基于我的存储库和服务。我想保存另一个数据与邮递员只改变播放器id。但它不是创建一个新的实体数据。它更新现有的实体数据。我的问题是如何更新一个数据由我的服务当它找到一个现有的id。但当它找到一个新的id将保存一个新的数据到数据库。 这是我的回购: 这是我的服务:

  • 我有一个Spring应用程序,其中Domain Object标识符不是由数据库分配的,而是由应用程序生成的。标识符是在BeforeSave回调期间生成并添加到Domain Object中的。保存域对象(插入)后,当尝试保存具有相同标识符的域对象(更新)时,我收到以下错误 原因:组织。springframework。道。Incorrectupdatesemanticdataaccessexcepti

  • 我使用SpringBoot@CachePut和@Cacheable注释来缓存数据。 在buildCache中,我从远程数据库获取值,并将这些值保存在本地数据库和缓存中。在getCache方法中,我从本地数据库获取值。当我第一次调用getCache方法时,它被执行,本地DB值被保存在缓存中。然后我调用buildCache方法来更新缓存和本地DB值。之后,我再次调用getCache方法来获取更新后的值