大話西游666
2023-09-07 10:10:11
我的父組件最終帶有如下所示的嵌套片段:query MyAppQuery( $id $a $b $c) { viewer { ...App_viewer ...ComponentA_viewer @include(if: $a) ...ComponentB_viewer @include(if: $b) ...ComponentC_viewer @include(if: $c) } allEmployees: allUsers(userType: "1") { ...ComponentA_allEmployees @include(if: $a) ...ComponentB_allEmployees @include(if: $b) ...ComponentC_allEmployees @include(if: $c) }};如果我不包含所有這些子片段,則中繼會失敗,但所有這些子片段的數據都是相同的,必須在需要登錄用戶的所有子組件上聲明視圖片段似乎很愚蠢。如何在應用程序頂部請求這段數據并將其提供給子組件,而不必包含所有這些片段。這開始感覺像是反向螺旋鉆探,我必須在應用程序的下端聲明一個片段并將其傳遞到鏈上。與所有員工相同。這是相同的數據,我應該只獲取一次并通過上下文傳遞或訪問,但我必須傳遞所有這些愚蠢的片段或中繼抱怨。
1 回答

largeQ
TA貢獻2039條經驗 獲得超8個贊
這是 Relay 的核心模式,盡管很冗長,但實際上是高度鼓勵的。
在 Relay 中,鼓勵子組件以片段的形式自行指定其數據需求。
最終,您將積累大量碎片,這些碎片會傳播到應用程序的其他地方,因此值得指出一些關鍵的 Relay 功能來說明為什么這是好的:
如果您聲明多個彼此相鄰的片段請求相同的字段,Relay 不會向您的 API 發送重復的請求。相反,它們將在一次往返中全部獲取一次。您不必擔心引入過度獲取/重復查詢問題,因為它們在 Relay 中不存在。
graphql
Relay 通過 Relay 編譯器引入了一個編譯步驟,該步驟可以智能地分析您的 GraphQL 架構以及您在代碼中定義的任何模板標簽。這會生成artifacts,它有助于自動管理數據獲取和更新中繼存儲,因此您不必這樣做。通過聲明大量片段,您可以有效地告訴編譯器和存儲組件的數據要求,即使它們是相同/相似的。復制是 Relay 的偉大之處。位于樹根部的 QueryRenderer 祖先將處理實際的獲取,并且您在樹中較低的子組件上定義的片段會指示 Relay Compiler 和 Store 在獲取數據后將數據發送到何處。這是從#2 得出的。
因此,簡而言之,要充分利用 Relay,請使用片段聲明組件的數據需求,并讓 Relay 完成繁重的工作,而不必擔心重復和缺乏可重用性。這對你有利。
添加回答
舉報
0/150
提交
取消