片段不能在这里作为“查询”类型的对象传播

问题描述 投票:0回答:1

尝试使用反应继电器,今天遇到了这个问题。这是我到目前为止所做的。

根查询:

query {
  tasks {
    id
    taskName
    taskStatus
    userId
  }
}

反应组件层次结构

App   
 ↳--TaskList (props: tasks)
    ↳--TaskListItem (props: task)

现在由于托管原则,我知道我必须在每个组件中编写片段来描述他们的数据需求。

TaskListItem.js

const TaskListItemContainer = createFragmentContainer(
    TaskListItem,
    graphql`
        fragment TaskListItem_task on task {
            id
            taskName
            taskDone
            authorId
        }
    `
);

TaskList.js

const TaskListContainer = createFragmentContainer(
    TaskList,
    graphql`
        fragment TaskList_tasks on task {
            tasks {
                ...TaskListItem_task
            }
        }
    `
);

App.js

<QueryRenderer
   environment={relayEnvironment}
   query={graphql`
       query AppQuery {
         ...TaskList_tasks
       }
     `
   }

当我运行中继编译器时,我收到以下错误。

Fragment "TaskList_tasks" cannot be spread here as objects of type "Query" can never be of type "task".

App.js (3:15)
2:             query AppQuery {
3:               ...TaskList_tasks
                 ^
4:             }

由于这个问题,无法弄清楚如何组织结构。我应该修改架构只是为了方便客户端的片段结构和重用吗?

graphql-js relayjs relay relaymodern react-relay
1个回答
1
投票

基本片段包含五件事:

  • fragment关键字
  • 片段的名称
  • on关键字
  • Fragment适用的类型
  • 选择集包裹在一组花括号中

选择集是您在使用Fragment时要指定的类型的一个或多个字段。可以将Fragment视为单个选择集的替代品。如果我有这样的查询:

query {
  foo
  bar
}

那么{ foo bar }是我正在请求的选择集,在这种情况下是Query类型(或者你的模式中调用的任何查询根操作类型)。所以,如果我想使用一个片段,我会写:

query {
  ...QueryFields
}

fragment QueryFields on Query {
  foo
  bar
}

在您的代码中,您正在尝试编写如下查询:

query {
  ...TaskList_tasks
}

但是,如错误所示,与TaskList_tasks片段相关的类型是task。但是你没有在这里替换task类型的选择集,你正在替换Query类型的选择集。所以你的请求无效。

TLDR;您需要将片段上的类型更改为Query

fragment TaskList_tasks on Query {
  tasks {
    ...TaskListItem_task
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.