大佬封裝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 'react'; 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 'react'; 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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

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

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

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

要在使用Composer時變得熟練,需要掌握以下技能:1.熟練使用composer.json和composer.lock文件,2.理解Composer的工作原理,3.掌握Composer的命令行工具,4.了解基本和高級用法,5.熟悉常見錯誤與調試技巧,6.優化使用和遵循最佳實踐。

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

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

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

成為作曲家的步驟包括:1.掌握音樂基本元素,如音符、節奏、和聲、旋律;2.選擇合適的技術工具,如AbletonLive;3.理解作曲的過程,包括靈感獲取、構思、編寫、修改和完善;4.從簡單旋律創作開始,逐步嘗試複雜技巧如和聲進行;5.通過調試技巧解決常見問題,如音符選擇和節奏安排;6.應用性能優化和最佳實踐,如使用模板、版本控制和協作。
