片段“F1”不能在这里传播,因为“节点”类型的对象永远不能是“商店”类型
Posted
技术标签:
【中文标题】片段“F1”不能在这里传播,因为“节点”类型的对象永远不能是“商店”类型【英文标题】:Fragment "F1" cannot be spread here as objects of type "Node" can never be of type "Store" 【发布时间】: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 的值时,它会抛出上述错误。
洞察力可能有用且值得赞赏。谢谢
【问题讨论】:
【参考方案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
,它应该可以工作。
【讨论】:
以上是关于片段“F1”不能在这里传播,因为“节点”类型的对象永远不能是“商店”类型的主要内容,如果未能解决你的问题,请参考以下文章
深入理解DOM节点类型第四篇——文档片段节点DocumentFragment