中继pyramida graphql更新存储

时间:2018-12-07 00:58:26

标签: reactjs graphql relayjs prisma

我正在尝试使棱镜和继电器工作。这是我的仓库:

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

这是一个简单的待办事项清单。我可以添加待办事项,但ui不会更新。当我刷新时,待办事项就在那里。

我可以找到所有更新商店的示例,它们对要更新/创建的对象使用“父级”。

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

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

从中继运行时的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);
 * }

是否可以在没有“父母”的情况下更新商店?我只有待办事项,没有父母。

再次创建记录,并给出以下响应:

  

{“数据”:{       “ 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);

},

我已经完成了console.log(conn),并且它是未定义的。

请帮助。

----编辑---- 多亏了Denis,我认为一个问题得以解决-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             文本           }         }

如何像这样获取getLinkedRecord?

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

1 个答案:

答案 0 :(得分:1)

如果query是父级,则parentID将是client:root

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

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

创建一个const ROOT_ID = 'client:root';并通过ROOT_ID作为您的parentID。另外,请检查更新程序上的连接名称,该名称必须与声明查询的名称完全相同。

更新: 实际上,您可以导入ROOT_ID中的relay-runtime

import { ROOT_ID } from 'relay-runtime';

更新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,
      });

connectionUpdater是一个看起来像这样的辅助函数:

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);
    }
  }
}

希望它会有所帮助:)