好问题。当您处理 Relay 时,您的想法是正确的,因为每个组件都应该有自己的片段,以便查询本身准确地映射到该特定组件所需的数据。片段的命名可以随心所欲,但类型不能随意。它必须是根查询对象(或您将片段附加到的任何字段)下的声明类型。否则,该片段将抛出一个错误,指出您无法在 Query 或字段上查询该类型。
例如:
var componentOneFragment = Relay.QL`
fragment on User {
name
}
`;
这里要注意的一件事是,您不需要为像fragment userFragment on User { ... }
. 通过声明${Component.getFragment(componentOneFragment)}
. 希望这可以帮助!
编辑:
对每个组件使用相同的“查看器”查询,并在每个组件上定义一个免费的“查看器”片段。尽管名称相同,但这些片段都会定义不同的数据需求,这看起来很混乱。
尽管片段的相同名称可能看起来令人困惑,但这是思考事物的最佳方式。每个组件确实有不同的数据需求,所以它们的 Relay 容器自然会有不同的分片,但仍然使用相同的分片名称。
此片段可能包含在需要用户数据的中继容器之一中:
const WidgetList = Relay.createContainer(/* ... */, {
initialVariables: {
color: null,
size: null,
limit: null
},
fragments: {
viewer: () => Relay.QL`
fragment on User {
widgets(color: $color, size: $size, first: $limit) {
edges {
node {
name,
},
},
},
}
`
}
});
虽然这个片段(仍然具有相同的名称)可能包含在另一个需要 Widget 数据的 Relay 容器中:
const ActionsList = Relay.createContainer(/* ... */, {
initialVariables: {
input: null
},
fragments: {
viewer: () => Relay.QL`
fragment on Widget {
actions(input: $input) {
edges {
node {
name,
},
},
},
}
`
}
});
$Component.getFragment('viewer')
只要User和Widget都是 Root Query 对象下的类型,它们都可以在同一个 GraphQL 查询中动态使用(即)。