为什么片段数据被提取但是中继突变无法访问

Fer*_*den 0 graphql relayjs

我有突变(代码),我想删除一个节点.它依赖于post rowId - 它是数据库中行的主键 - 以及查看者ID.当相关组件(代码)被渲染时.发送以下查询

query Queries {
  viewer {
    id,
    ...F1
  }
}
fragment F0 on Viewer {
  id
}
fragment F1 on Viewer {
  id,
  ...F0
}
Run Code Online (Sandbox Code Playgroud)

query Queries($id_0:ID!) {
  post(id:$id_0) {
    id,
    ...F2
  }
}
fragment F0 on Post {
  id,
  rowId
}
fragment F1 on Post {
  rowId,
  id
}
fragment F2 on Post {
  headline,
  body,
  id,
  ...F0,
  ...F1
}
Run Code Online (Sandbox Code Playgroud)

我得到的回应包括viewer.idpost.rowId.正如你在这里看到的,

{
  "data": {
    "post": {
      "id": "cG9zdDo0",
      "headline": "You hit me with a cricket bat.",
      "body": "Hello.",
      "rowId": 4
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

和这里,

{
  "data": {
    "viewer": {
      "id": "viewer"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然而,当我想将它们传递给DeletePostMutation像这样this.props.post.id它们undefined.当我检查时this.props.post,我得到以下内容

安慰

Jos*_*ruz 5

错误表明向下传递给DeletePostMutation的道具不是Relay提取的数据,看着代码,你似乎正在为帖子观众构建一个新对象,而不是发送由中继提取的帖子和查看器.

我看到你这样做了:

  handleDelete(event) {
    this.props.relay.commitUpdate(
      new DeletePostMutation({
        post: { rowId: this.props.post.rowId },
        viewer: { id: this.props.viewer.id },
      })
    )
  }
Run Code Online (Sandbox Code Playgroud)

试试这个:

  handleDelete(event) {
    this.props.relay.commitUpdate(
      new DeletePostMutation({
        post: this.props.post,
        viewer: this.props.viewer,
      })
    )
  }
Run Code Online (Sandbox Code Playgroud)

由于您已经在Post Relay容器内组成了DeletePostMutation的GraphQL片段,因此DeletePostMutation内部,每个prop都应该可以访问片段中定义的字段.