片段不能作为 "Query" 类型的对象在此处传播
fragment cannot be spread here as objects of type "Query"
今天用 React 和 运行 尝试接力。这是我到目前为止所做的。
根查询:
query {
tasks {
id
taskName
taskStatus
userId
}
}
React 组件层次结构
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: }
由于这个问题,无法弄清楚如何组织结构。我应该修改模式只是为了方便客户端的片段结构和重用吗?
一个基本的 Fragment 由五部分组成:
fragment
关键字
- 片段名称
on
关键字
- 片段适用的类型
- 用一组大括号包裹的选择集
选择集是您在使用Fragment时指定要请求的类型的一个或多个字段。将片段视为单个选择集的替代品。如果我有这样的查询:
query {
foo
bar
}
然后 { foo bar }
是我请求的选择集,在本例中是 Query
类型(或者您的架构中调用的任何查询根操作类型)。所以如果我想使用片段,我会写:
query {
...QueryFields
}
fragment QueryFields on Query {
foo
bar
}
在您的代码中,您尝试编写如下查询:
query {
...TaskList_tasks
}
但是,如错误所示,与 TaskList_tasks
片段关联的类型是 task
。但是您不是在此处替换 task
类型的选择集,而是替换 Query
类型的选择集。所以你的请求是无效的。
TLDR; 您需要将 Fragment 上的类型更改为 Query
:
fragment TaskList_tasks on Query {
tasks {
...TaskListItem_task
}
}
今天用 React 和 运行 尝试接力。这是我到目前为止所做的。
根查询:
query {
tasks {
id
taskName
taskStatus
userId
}
}
React 组件层次结构
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: }
由于这个问题,无法弄清楚如何组织结构。我应该修改模式只是为了方便客户端的片段结构和重用吗?
一个基本的 Fragment 由五部分组成:
fragment
关键字- 片段名称
on
关键字- 片段适用的类型
- 用一组大括号包裹的选择集
选择集是您在使用Fragment时指定要请求的类型的一个或多个字段。将片段视为单个选择集的替代品。如果我有这样的查询:
query {
foo
bar
}
然后 { foo bar }
是我请求的选择集,在本例中是 Query
类型(或者您的架构中调用的任何查询根操作类型)。所以如果我想使用片段,我会写:
query {
...QueryFields
}
fragment QueryFields on Query {
foo
bar
}
在您的代码中,您尝试编写如下查询:
query {
...TaskList_tasks
}
但是,如错误所示,与 TaskList_tasks
片段关联的类型是 task
。但是您不是在此处替换 task
类型的选择集,而是替换 Query
类型的选择集。所以你的请求是无效的。
TLDR; 您需要将 Fragment 上的类型更改为 Query
:
fragment TaskList_tasks on Query {
tasks {
...TaskListItem_task
}
}