如何让 Relay Modern 片段合成发挥作用?
How can I get Relay Modern fragment composition to work?
我正在努力了解如何让片段组合正常工作。我有一个根 <QueryRenderer />
,其中包含我需要的片段。我可以看到片段被合并并且查询 returns 我需要的所有数据。数据被传递到我页面中的主渲染节点,但是当它被传递到子节点时,中继抱怨:
Warning: RelayModernSelector: Expected object to contain data for fragment `BoardControlsComponent_processMeta`, got `{"item": 1, "name": "Test"}`. Make sure that the parent operation/fragment included fragment `...BoardControlsComponent_processMeta`.
代码:
export let BoardContainer = createFragmentContainer(BoardComponent, {
processMeta: NavbarFragment.processMeta,
});
export const Board = ({match}) => {
return (<QueryRenderer
environment={environment}
variables={{
processId: match.params.processId,
boardType: match.params.boardType,
boardClass: match.params.boardClass
}}
query={BoardDataQuery}
render={({error, props}) => {
if (error) {
return <div>{error.message}</div>;
} else if (props) {
//console.log(props);
return (<BoardContainer {...props} match={match}/>);
}
return <ProgressBar active now={100} />;
}}
/>
);
};
在 BoardComponent 的 render() 中:
<BoardControlsContainer processMeta={this.props.processMeta} />
BoardDataQuery:
export const BoardDataQuery = graphql`
query BoardDataQuery($processId: Int!, $boardClass: String!, $boardType: String!) {
processMeta(processId: $processId, boardClass: $boardClass, boardType: $boardType) {
...NavbarComponent_processMeta
...BoardControlsComponent_processMeta
}
}
`;
BoardControlsContainer:
export const BoardControlsContainer = createFragmentContainer(BoardControlsComponent, {
processMeta: BoardControlsFragment.processMeta
});
所以 BoardDataQuery 包括 2 个组件的 ProcessMeta 字段,并检查浏览器中的网络调试控制台确认所有数据都按要求返回。将此数据作为 prop 传递会导致 Relay 抱怨,因为它期待的是片段而不是填充的对象。不仅如此,实际传递的对象也没有指定的额外字段。
我做错了什么?
原来是我对Relay如何组成片段的理解有误
首先,如果目标组件没有按照命名标准定义片段,Relay 只会传递一个内部对象。
其次,即使片段被组合到根查询中以便使用数据,每个组件也必须指定自己的数据要求。本质上,我需要在 BoardDataQuery 中添加额外的字段,以便 BoardContainer
组件可以使用它们。
我正在努力了解如何让片段组合正常工作。我有一个根 <QueryRenderer />
,其中包含我需要的片段。我可以看到片段被合并并且查询 returns 我需要的所有数据。数据被传递到我页面中的主渲染节点,但是当它被传递到子节点时,中继抱怨:
Warning: RelayModernSelector: Expected object to contain data for fragment `BoardControlsComponent_processMeta`, got `{"item": 1, "name": "Test"}`. Make sure that the parent operation/fragment included fragment `...BoardControlsComponent_processMeta`.
代码:
export let BoardContainer = createFragmentContainer(BoardComponent, {
processMeta: NavbarFragment.processMeta,
});
export const Board = ({match}) => {
return (<QueryRenderer
environment={environment}
variables={{
processId: match.params.processId,
boardType: match.params.boardType,
boardClass: match.params.boardClass
}}
query={BoardDataQuery}
render={({error, props}) => {
if (error) {
return <div>{error.message}</div>;
} else if (props) {
//console.log(props);
return (<BoardContainer {...props} match={match}/>);
}
return <ProgressBar active now={100} />;
}}
/>
);
};
在 BoardComponent 的 render() 中:
<BoardControlsContainer processMeta={this.props.processMeta} />
BoardDataQuery:
export const BoardDataQuery = graphql`
query BoardDataQuery($processId: Int!, $boardClass: String!, $boardType: String!) {
processMeta(processId: $processId, boardClass: $boardClass, boardType: $boardType) {
...NavbarComponent_processMeta
...BoardControlsComponent_processMeta
}
}
`;
BoardControlsContainer:
export const BoardControlsContainer = createFragmentContainer(BoardControlsComponent, {
processMeta: BoardControlsFragment.processMeta
});
所以 BoardDataQuery 包括 2 个组件的 ProcessMeta 字段,并检查浏览器中的网络调试控制台确认所有数据都按要求返回。将此数据作为 prop 传递会导致 Relay 抱怨,因为它期待的是片段而不是填充的对象。不仅如此,实际传递的对象也没有指定的额外字段。
我做错了什么?
原来是我对Relay如何组成片段的理解有误
首先,如果目标组件没有按照命名标准定义片段,Relay 只会传递一个内部对象。
其次,即使片段被组合到根查询中以便使用数据,每个组件也必须指定自己的数据要求。本质上,我需要在 BoardDataQuery 中添加额外的字段,以便 BoardContainer
组件可以使用它们。