【问题标题】:fragment cannot be spread here as objects of type "Query"片段不能作为“查询”类型的对象在这里传播
【发布时间】:2019-09-11 20:04:30
【问题描述】:

用 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:             }

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

【问题讨论】:

    标签: graphql-js relayjs relay relaymodern react-relay


    【解决方案1】:

    一个基本的 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
      }
    }
    

    【讨论】:

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