搜尋
首頁開發工具composer大佬封裝React Context Composer的詳細步驟(分享)

本文由composer教學欄位來介紹大佬是如何一步步封裝一個React Context Composer,希望對需要的朋友有幫助!

我是如何一步步封裝一個React Context Composer?

動機

React的狀態管理方案有很多,像是Redux、Mobx、Recoil等,目前我只體驗過Redux,覺得還是比較笨重一點。因為平常寫Hooks比較多,所以我比較傾向使用Context Provider配合useContext這個hook來做,這樣也易於狀態的拆分與組合。這裡,我們不討論各家狀態管理方案的優劣,將目光聚焦在使用Context時遇到的一個多層嵌套的問題。

下圖,是我最近在寫的一個taro react hooks ts專案抽離出來的一些程式碼。我對一些全域狀態進行了拆分(拆分的目的是為了減少不必要的重新渲染),然後再把它們嵌套起來。這種寫法讓我回想起了曾經被回調地獄支配的感覺,很難受。因此,我想到了自己去封一個高階組件,從寫法上把結構「扁平化」。

<LoadingContext.Provider value={{ loading, setLoading }}>
  <UserDataContext.Provider value={{ name: "ascodelife", age: 25 }}>
    <ThemeContext.Provider value={"light"}>
    {/* ....more Providers as long as you want */}
    </ThemeContext.Provider>
  </UserDataContext.Provider>
</LoadingContext.Provider>

最容易得到的方案

這裡,我很快的就寫出了第一個方案,借助reduceRight去完成Provider的巢狀。

這裡用reduceRight而不用reduce的原因是,我們更習慣從外層到內層的書寫順序。

// ContextComposer.tsx
import React from &#39;react&#39;;
type IContextComposerProps = {
  contexts: { context: React.Context<any>; value: any }[];
};
const ContextComposer: React.FC<IContextComposerProps> = ({ contexts, children }) => {
  return (
    <>
      {contexts.reduceRight((child, parent) => {
        const { context, value } = parent;
        return <context.Provider value={value}>{child}</context.Provider>;
      }, children)}
    </>
  );
};
export default ContextComposer;
// App.tsx
<ContextComposer
  contexts={[
    { context: ThemeContext, value: "light" },
    { context: UserDataContext, value: { name: "ascodelife", age: 25 } },
    { context: LoadingContext, value: { loading, setLoading } },
  ]}>
    { children }
</ContextComposer>

實際體驗後發現,雖然說能用是能用,但是開發體驗差那麼一點。它的問題在於,元件入參時傳的value是any類型,這意味著放棄了ts的靜態型別檢查。在傳參時,由於不會對value做靜態類型檢查,敲起程式碼來不僅不會有任何程式碼提示,也有可能造成一些比較低階的執行時間錯誤。差評!

基於React.cloneElement()的改造方案

為了改造上面的這個方案,我翻到了一個比較冷門但好用的函數- React. cloneElement()。這個函數沒有很多需要值得注意的點,主要看一眼它的三個入參,第一個是parent element,第二個是parent props,第三個是剩餘參數...children,除第一個參數外面,其他都是可選值。

舉個例子:

<!-- 调用函数 -->
React.cloneElement(<div/>,{},<span/>);
<!-- 相当于创建了这样一个结构 -->
<div> 
    <span></span>
</div>

那麼下面開始改造,reduceRight的架子不動,改一下入參的類型和reduceRight的回調。

// ContextComposer.tsx
import React from &#39;react&#39;;
type IContextComposerProps = {
  contexts: React.ReactElement[];
};
const ContextComposer: React.FC<IContextComposerProps> = ({ contexts, children }) => {
  return (
    <>
      {contexts.reduceRight((child, parent) => {
        return React.cloneElement(parent,{},child);
      }, children)}
    </>
  );
};
export default ContextComposer;
// App.tsx
<ContextComposer
  contexts={[
      <ThemeContext.Provider value={"light"} />,
      <UserDataContext.Provider value={{ name: "ascodelife", age: 25 }} />,
      <LoadingContext.Provider value={{ loading, setLoading }} />,
  ]}>
    { children }
</ContextComposer>

經過改造後,我們在傳參時就好像是真的在創建一個元件(當然實際上也創建了元件,只是這個元件本身沒有被渲染到虛擬Dom上,實際渲染上去的是被克隆後的副本)。同時,我們剛才關注的value的靜態類型檢查問題也得到了解決。

tips: React.cloneElement(parent,{},child)等價於React.cloneElement(parent,{children:child}),你知道為什麼嗎?

相關資源

原始碼已經同步到了github(https://github.com/ascodelife/react-context-provider-composer)。

同時也打包到了npm倉庫(https://www.npmjs.com/package/@ascodelife/react-context-provider-composer),歡迎體驗。

以上是大佬封裝React Context Composer的詳細步驟(分享)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:juejin。如有侵權,請聯絡admin@php.cn刪除
作曲家在做什麼?作曲家在做什麼?Apr 08, 2025 am 12:19 AM

Composer是PHP的依賴管理工具,用於聲明、下載和管理項目依賴。 1)通過composer.json文件聲明依賴,2)使用composerinstall命令安裝依賴,3)解析依賴樹並從Packagist下載,4)生成autoload.php文件簡化自動加載,5)優化使用包括使用composerupdate--prefer-dist和調整autoload配置。

什麼是應用作曲家?什麼是應用作曲家?Apr 07, 2025 am 12:07 AM

AppComposer是一種用於構建和管理應用程序的工具。 1)它通過拖拽和配置預定義組件簡化應用開發,提高效率。 2)開發者可以定義組件、組合界面、定義業務邏輯,並最終渲染應用。 3)支持基本和高級用法,如任務管理和條件渲染,幫助構建靈活的應用。

作曲家是用什麼?作曲家是用什麼?Apr 06, 2025 am 12:02 AM

Composer是PHP的依賴管理工具。使用Composer的核心步驟包括:1)在composer.json中聲明依賴,如"stripe/stripe-php":"^7.0";2)運行composerinstall下載並配置依賴;3)通過composer.lock和autoload.php管理版本和自動加載。 Composer簡化了依賴管理,提升了項目效率和可維護性。

什麼是作曲家AI?什麼是作曲家AI?Apr 05, 2025 am 12:13 AM

ComposerAI是一個基於人工智能的工具,用於生成和優化代碼,提高開發效率和質量。其功能包括:1.代碼生成:根據需求生成符合標準的代碼片段。 2.代碼優化:通過分析現有代碼,提出優化建議。 3.自動化測試:生成測試用例,確保代碼質量。

什麼是Android中的作曲家?什麼是Android中的作曲家?Apr 04, 2025 am 12:18 AM

Composer在Android中是SurfaceFlinger服務的一部分,負責將多個圖形層合成到最終顯示緩衝區。 1)收集圖形層,2)排序圖形層,3)合成圖形層,4)輸出到顯示設備,提升應用性能和用戶體驗。

作曲家的定義是什麼?作曲家的定義是什麼?Apr 03, 2025 am 12:17 AM

作曲家是創作音樂的人,他們通過音樂表達情感、講述故事、傳達思想。作曲家的工作包括:1.構思:確定作品的主題和風格;2.創作:編寫旋律和和聲,形成初步的樂曲結構;3.試驗:通過樂器或軟件試奏和調整作品;4.完善:根據試奏結果進行修改和完善,直到滿意為止。

作曲家和編排者有什麼區別?作曲家和編排者有什麼區別?Apr 02, 2025 pm 02:49 PM

Composer用於管理PHP項目的依賴,而Orchestrator用於管理和協調微服務或容器化的應用。 1.Composer通過composer.json文件聲明並管理PHP項目的依賴。 2.Orchestrator通過配置文件(如Kubernetes的YAML文件)管理服務的部署和擴展,確保高可用性和負載均衡。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具