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