簡體   English   中英

如何讓Relay Modern片段組合工作?

[英]How can I get Relay Modern fragment composition to work?

我正在努力了解如何讓片段組合正常工作。 我有一個root <QueryRenderer /> ,它包含我需要的片段。 我可以看到片段被合並,查詢返回我需要的所有數據。 數據傳遞到我的頁面中的主渲染節點,但是當它傳遞給子節點時,Relay會抱怨:

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組件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM