摘要:組件可以處理其他組件的實例化為了避免破壞封裝,請注意通過傳遞的內容。因此,將狀態管理的父組件實例傳遞給子組件會破壞封裝。讓我們改進兩個組件的結構和屬性,以便恢復封裝。組件的可重用性和可測試性顯著增加。
翻譯:劉小夕原文鏈接:https://dmitripavlutin.com/7-...
原文的篇幅非常長,不過內容太過于吸引我,還是忍不住要翻譯出來。此篇文章對編寫可重用和可維護的React組件非常有幫助。但因為篇幅實在太長,我對文章進行了分割,本篇文章重點闡述 封裝。因本人水平有限,文中部分翻譯可能不夠準確,如果您有更好的想法,歡迎在評論區指出。
更多文章可戳: https://github.com/YvetteLau/...
———————————————我是一條分割線————————————————
封裝一個封裝組件提供 props 控制其行為而不是暴露其內部結構。
耦合是決定組件之間依賴程度的系統特性。根據組件的依賴程度,可區分兩種耦合類型:
當應用程序組件對其他組件知之甚少或一無所知時,就會發生松耦合。
當應用程序組件知道彼此的許多詳細信息時,就會發生緊耦合。
松耦合是我們設計應用結構和組件之間關系的目標。
松耦合應用(封裝組件)
松耦合會帶來以下好處:
可以在不影響應用其它部分的情況下對某一塊進行修改。、
任何組件都可以替換為另一種實現
在整個應用程序中實現組件復用,從而避免重復代碼
獨立組件更容易測試,增加了測試覆蓋率
相反,緊耦合的系統會失去上面描述的好處。主要缺點是很難修改高度依賴于其他組件的組件。即使是一處修改,也可能導致一系列的依賴組件需要修改。
緊耦合應用(組件無封裝)
封裝 或 信息隱藏 是如何設計組件的基本原則,也是松耦合的關鍵。
信息隱藏封裝良好的組件隱藏其內部結構,并提供一組屬性來控制其行為。
隱藏內部結構是必要的。其他組件沒必要知道或也不依賴組件的內部結構或實現細節。
React 組件可能是函數組件或類組件、定義實例方法、設置 ref、擁有 state 或使用生命周期方法。這些實現細節被封裝在組件內部,其他組件不應該知道這些細節。
隱藏內部結構的組件彼此之間的依賴性較小,而降低依賴度會帶來松耦合的好處。
通信細節隱藏是隔離組件的關鍵。此時,你需要一種組件通信的方法:props。porps 是組件的輸入。
建議 prop 的類型為基本數據(例如,string 、 number 、boolean):
;
必要時,使用復雜的數據結構,如對象或數組:
prop 可以是一個事件處理函數和異步函數:
prop 甚至可以是一個組件構造函數。組件可以處理其他組件的實例化:
function If({ component: Component, condition }) { return condition ?: null; }
為了避免破壞封裝,請注意通過 props 傳遞的內容。給子組件設置 props 的父組件不應該暴露其內部結構的任何細節。例如,使用 props 傳輸整個組件實例或 refs 都是一個不好的做法。
訪問全局變量同樣也會對封裝產生負面影響。
案例研究:封裝修復組件的實例和狀態對象是封裝在組件內部的實現細節。因此,將狀態管理的父組件實例傳遞給子組件會破壞封裝。
我們來研究一下這種情況。
一個簡單的應用程序顯示一個數字和兩個按鈕。第一個按鈕增加數值,第二個按鈕減少數值:
這個應用由兩個組件組成:
number 是
// 問題: 封裝被破壞 class App extends Component { constructor(props) { super(props); this.state = { number: 0 }; } render() { return ({this.state.number}); } }
// 問題: 使用父組件的內部結構 class Controls extends Component { render() { return (); } updateNumber(toAdd) { this.props.parent.setState(prevState => ({ number: prevState.number + toAdd })); } }
當前的實現有什么問題?
第一個問題是:
第二個問題是: 子組件 Controls 知道了太多父組件
一個麻煩的結果是:
解決方案是設計一個方便的通信接口,考慮到松耦合和封裝。讓我們改進兩個組件的結構和屬性,以便恢復封裝。
只有組件本身應該知道它的狀態結構。
// 解決: 恢復封裝 class App extends Component { constructor(props) { super(props); this.state = { number: 0 }; } render() { return ({this.state.number}); } updateNumber(toAdd) { this.setState(prevState => ({ number: prevState.number + toAdd })); } }this.updateNumber(+1)} onDecrease={() => this.updateNumber(-1)} />
現在,
而且,
// 解決方案: 使用回調函數去更新父組件的狀態 function Controls({ onIncrease, onDecrease }) { return (); }
此外,
最后謝謝各位小伙伴愿意花費寶貴的時間閱讀本文,如果本文給了您一點幫助或者是啟發,請不要吝嗇你的贊和Star,您的肯定是我前進的最大動力。https://github.com/YvetteLau/...
關注小姐姐的公眾號,加入交流群。文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/106577.html
摘要:單元測試不僅涉及早期錯誤檢測。當組件的架構設計很脆弱時,就會變得難以測試,而當組件難以測試的時候,你大概念會跳過編寫單元測試的過程,最終的結果就是組件未測試。可測試性是確定組件結構良好程度的實用標準。可復用的組件是精心設計的系統的結果。 翻譯:劉小夕原文鏈接:https://dmitripavlutin.com/7-... 本篇文章重點闡述可測試和富有意義。因水平有限,文中部分翻譯可...
摘要:幸運的是,組合易于理解。組件的組合是自然而然的。高效用戶界面可組合的層次結構,因此,組件的組合是一種構建用戶界面的有效的方式。這個原則建議避免重復。只有一個組件符合單一責任原則并且具有合理的封裝時,它是可復用的。 翻譯:劉小夕原文鏈接:https://dmitripavlutin.com/7-... 原文的篇幅非常長,不過內容太過于吸引我,還是忍不住要翻譯出來。此篇文章對編寫可重用和...
摘要:編寫組件時要考慮的基本準則是單一職責原則。這些更改通常要求組件在隔離狀態下易于修改這也是的目標。解決多重責任問題需要將分割為兩個組件和。組件之間的通信是通過實現。更改的唯一原因是修改表單字段。 翻譯:劉小夕原文鏈接:https://dmitripavlutin.com/7-... 原文的篇幅非常長,不過內容太過于吸引我,還是忍不住要翻譯出來。此篇文章對編寫可重用和可維護的React組...
摘要:函數式編程與面向對象編程編程的本質之劍目錄編程的本質讀到兩篇文章寫的不錯綜合摘錄一下復合是編程的本質函數式程序員在洞察問題方面會遵循一個奇特的路線。在面向對象編程中,類或接口的聲明就是表面。 函數式編程與面向對象編程[5]:編程的本質 之劍 2016.5.6 01:26:31 編程的本質 讀到兩篇文章,寫的不錯, 綜合摘錄一下 復合是編程的本質 函數式程序員在洞察問題方面會遵循...
閱讀 2251·2021-11-23 09:51
閱讀 1080·2021-11-22 15:35
閱讀 4867·2021-11-22 09:34
閱讀 1610·2021-10-08 10:13
閱讀 3026·2021-07-22 17:35
閱讀 2546·2019-08-30 15:56
閱讀 3088·2019-08-29 18:44
閱讀 3100·2019-08-29 15:32