gpt4 book ai didi

graphql - Relay Modern 节点不包含片段属性

转载 作者:行者123 更新时间:2023-12-02 16:51:51 25 4
gpt4 key购买 nike

我的 React 项目中有以下设置:

export default class OverviewScreen extends React.Component<any, any> {

public render() {

return (
<QueryRenderer
environment={environment}
query={OverviewScreenQuery}
render={this.queryRender}/>
);
}

protected queryRender({error, props}): JSX.Element {

if (error) {
return <div>{error.message}</div>;
} else if (props) {
return (
<div>
<div>
<ActivityOfferList viewer={props.viewer} title="Titel"/>
<ActivityTypeListsFragment viewer={props.viewer}/>
</div>
</div>
);
}
return <div>Loading...</div>;
}
}

const OverviewScreenQuery = graphql`
query OverviewScreenQuery {
viewer {
...HorizontalOfferList_viewer
...ActivityTypeLists_viewer
}
}`;
<小时/>
class ActivityTypeLists extends React.Component<IHorizontalOfferListProps, any> {

public render() {

return (
<div>
{this.props.viewer.allActivityTypes.edges.map((typeEdge) => {
let typeNode = typeEdge.node;
return this.getCardListForActivityType(typeNode);
})}
</div>
);
}

private getCardListForActivityType(typeNode: any) {
console.log(typeNode);

return (
<CardList key={typeNode.__id} title={typeNode.title}>
{typeNode.activities.edges.map(({node}) => {
return (
<RelayPicturedTypeActivityCard key={node.__id} offer={node} activityType={typeNode}/>
);
})}
</CardList>
);
}
}

export const ActivityTypeListsFragment = createFragmentContainer(ActivityTypeLists, graphql`
fragment ActivityTypeLists_viewer on Viewer {
allActivityTypes(first: 5) {
edges {
node {
...PicturedTypeActivityCard_offer
}
}
}
}
`);
<小时/>
export class PicturedTypeActivityCard extends React.Component<any, any> {

public render() {
return (
<PicturedCard title={this.props.offer.title} subtitle={this.props.activityType.title} width={3}/>
);
}
}

export const RelayPicturedTypeActivityCard = createFragmentContainer(PicturedTypeActivityCard, graphql`
fragment PicturedTypeActivityCard_offer on ActivityType {
title
activities(first: 4) {
edges {
node {
id
title
}
}
}
}
`);

这应该可以工作并从 graphcool 中继端点给我正确的结果。

对中继端点的网络调用确实正确,我从我的端点收到所有 ActivityType 及其事件和标题。

但不知何故,在函数 getCardListForActivityType() 中,typeNode 只包含节点的 __id 作为数据,根本没有标题:

enter image description here

如果我直接插入标题和事件而不是使用

...PicturedTypeActivityCard_offer

那么数据也能正确传递下来。所以 Fragment 的某些部分必须关闭。

<小时/>

为什么网络调用完成并正确使用fragment取数据,但节点对象却始终获取不到取到的数据?

最佳答案

这确实是正确的行为。

您的组件必须单独指定它们自己的所有数据依赖项,Relay 只会将其请求的数据传递给组件。由于您的组件没有询问任何数据,因此它接收的是空对象。

您看到的 __id 由 Relay 内部使用,您不应依赖它(这就是它具有 __ 前缀的原因)。

基本上,ActivityTypeLists 组件上的 viewer 属性将与 ActivityTypeLists_viewer 片段上请求的查询具有完全相同的格式,没有来自您在那里引用的其他组件的任何其他片段。

这称为数据屏蔽,请在以下链接中查看更多信息:

https://facebook.github.io/relay/docs/en/thinking-in-relay.html#data-masking https://facebook.github.io/relay/docs/en/graphql-in-relay.html#relaymask-boolean

关于graphql - Relay Modern 节点不包含片段属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45171855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com