【问题标题】:Fragment "F1" cannot be spread here as objects of type "Node" can never be of type "Store"片段“F1”不能在这里传播,因为“节点”类型的对象永远不能是“商店”类型
【发布时间】:2017-07-21 23:48:33
【问题描述】:

我写了下面的代码:

在某些用户操作上调用以下方法:

handleFolderClicked = (topic, parent) => {
    console.log('Main : handleFolderClicked called : ', parent);
    this.props.relay.setVariables({
      parentFolder: parent,
      email: loginEmail
    });
  }

Main = Relay.createContainer(Main, {
  initialVariables: {
    pageSize: pageSize,
    email: loginEmail,
    parentFolder: parentFolder,
  },
  fragments: {
    store: () => Relay.QL`
      fragment on Store {
        id,
        fileConnection(first:999, email:$email, parentFolder:$parentFolder) {
          ${DirectoryListing.getFragment('files')},
        }
        users {
          email,
        }
      }
    `,
  }
});
export default Main;

在页面加载时它工作正常并获取结果,但是当使用 setVariables 更改 parentFolder 的值时,它会抛出上述错误。

洞察力可能有用且值得赞赏。谢谢

【问题讨论】:

    标签: reactjs graphql relay


    【解决方案1】:

    我遇到了这个错误,我用这样的方法解决了:

    Store必须实现Relay的Node接口,也就是说它必须提供一个id: ID!字段,如果你使用返回的ID进行节点查询,你的Store必须被返回。

    在我的例子中,我将我的根对象命名为viewer,类型为Viewer;所以在实现Node 接口之后,这个查询必须工作:

    {
      viewer {
        id
      }
    }
    

    返回:

    {
      "data": {
        "viewer": {
          "id": "Vmlld2VyOk5vbmU="
        }
      }
    }
    

    现在,如果我使用该 ID 运行节点查询,则必须返回查看器。所以对于查询:

    {
      node(id: "Vmlld2VyOk5vbmU=") {
        id,
        __typename
      }
    }
    

    这应该是结果:

    {
      "data": {
        "node": {
          "id": "Vmlld2VyOk5vbmU=",
          "__typename": "Viewer"
        }
      }
    }
    

    将所有出现的viewer/Viewer 替换为store/Store,它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 2021-07-16
      • 2019-09-11
      • 2018-07-21
      • 2019-09-10
      • 2021-08-02
      • 2020-05-29
      • 2021-09-26
      相关资源
      最近更新 更多