亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在不重復片段的情況下傳遞道具

如何在不重復片段的情況下傳遞道具

大話西游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 功能來說明為什么這是好的:

  1. 如果您聲明多個彼此相鄰的片段請求相同的字段,Relay 不會向您的 API 發送重復的請求。相反,它們將在一次往返中全部獲取一次。您不必擔心引入過度獲取/重復查詢問題,因為它們在 Relay 中不存在。

  2. graphqlRelay 通過 Relay 編譯器引入了一個編譯步驟,該步驟可以智能地分析您的 GraphQL 架構以及您在代碼中定義的任何模板標簽。這會生成artifacts,它有助于自動管理數據獲取和更新中繼存儲,因此您不必這樣做。通過聲明大量片段,您可以有效地告訴編譯器和存儲組件的數據要求,即使它們是相同/相似的。復制是 Relay 的偉大之處。

  3. 位于樹根部的 QueryRenderer 祖先將處理實際的獲取,并且您在樹中較低的子組件上定義的片段會指示 Relay Compiler 和 Store 在獲取數據后將數據發送到何處。這是從#2 得出的。

因此,簡而言之,要充分利用 Relay,請使用片段聲明組件的數據需求,并讓 Relay 完成繁重的工作,而不必擔心重復和缺乏可重用性。這對你有利。


查看完整回答
反對 回復 2023-09-07
  • 1 回答
  • 0 關注
  • 104 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號