国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

可靠React組件設(shè)計(jì)的7個準(zhǔn)則之封裝

yck / 882人閱讀

摘要:組件可以處理其他組件的實(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í),你需要一種組件通信的方法:propsporps 是組件的輸入。

建議 prop 的類型為基本數(shù)據(jù)(例如,stringnumberboolean):

;

必要時(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)用由兩個組件組成:.

numberstate 對象, 負(fù)責(zé) 將這個數(shù)字渲染到頁面。

// 問題: 封裝被破壞
class App extends Component {
    constructor(props) {
        super(props);
        this.state = { number: 0 };
    }

    render() {
        return (
            
{this.state.number}
); } }

負(fù)責(zé)渲染按鈕,并為其設(shè)置事件處理函數(shù),當(dāng)用戶點(diǎn)擊按鈕時(shí),父組件的狀態(tài)將會被更新:number 加1或者減1((updateNumber()方法`)

// 問題: 使用父組件的內(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)有什么問題?

第一個問題是: 的封裝被破壞,因?yàn)樗膬?nèi)部結(jié)構(gòu)在應(yīng)用中傳遞。 錯誤地允許 直接去修改其 state

第二個問題是: 子組件 Controls 知道了太多父組件 的內(nèi)部細(xì)節(jié),它可以訪問父組件的實(shí)例,知道父組件是一個有狀態(tài)組件,知道父組件的 state 對象的細(xì)節(jié)(知道 number 是父組件 state 的屬性),并且知道怎么去更新父組件的 state.

一個麻煩的結(jié)果是: 將很難測試和重用。對 結(jié)構(gòu)的細(xì)微修改會導(dǎo)致需要對 進(jìn)行修改(對于更大的應(yīng)用程序,也會導(dǎo)致類似耦合的組件需要修改)。

解決方案是設(shè)計(jì)一個方便的通信接口,考慮到松耦合和封裝。讓我們改進(jìn)兩個組件的結(jié)構(gòu)和屬性,以便恢復(fù)封裝。

只有組件本身應(yīng)該知道它的狀態(tài)結(jié)構(gòu)。 的狀態(tài)管理應(yīng)該從 updateNumber()方法)移到正確的位置:即 組件中。

被修改為 設(shè)置屬性 onIncreaseonDecrease。這些是更新 狀態(tài)的回調(diào)函數(shù):

// 解決: 恢復(fù)封裝
class App extends Component {
    constructor(props) {
        super(props);
        this.state = { number: 0 };
    }

    render() {
        return (
            
{this.state.number} this.updateNumber(+1)} onDecrease={() => this.updateNumber(-1)} />
); } updateNumber(toAdd) { this.setState(prevState => ({ number: prevState.number + toAdd })); } }

現(xiàn)在, 接收用于增加和減少數(shù)值的回調(diào),注意解耦和封裝恢復(fù)時(shí): 不再需要訪問父組件實(shí)例。也不會直接去修改父組件的狀態(tài)。

而且, 被修改為了一個函數(shù)式組件:

// 解決方案: 使用回調(diào)函數(shù)去更新父組件的狀態(tài)
function Controls({ onIncrease, onDecrease }) {
    return (
        
); }

組件的封裝已經(jīng)恢復(fù),狀態(tài)由其本身管理,也應(yīng)該如此。

此外, 不在依賴 的實(shí)現(xiàn)細(xì)節(jié),onIncreaseonDecrease 在按鈕被點(diǎn)擊的時(shí)候調(diào)用, 不知道(也不應(yīng)該知道)這些回調(diào)的內(nèi)部實(shí)現(xiàn)。

組件的可重用性和可測試性顯著增加。

的復(fù)用變得很容易,因?yàn)樗诵枰卣{(diào),沒有其它依賴。測試也變得簡單,只需驗(yàn)證單擊按鈕時(shí),回調(diào)是否執(zhí)行。

最后謝謝各位小伙伴愿意花費(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

相關(guān)文章

  • 可靠React組件設(shè)計(jì)7準(zhǔn)則終篇

    摘要:單元測試不僅涉及早期錯誤檢測。當(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)闡述可測試和富有意義。因水平有限,文中部分翻譯可...

    jasperyang 評論0 收藏0
  • 可靠React組件設(shè)計(jì)7準(zhǔn)則組合和復(fù)用

    摘要:幸運(yùn)的是,組合易于理解。組件的組合是自然而然的。高效用戶界面可組合的層次結(jié)構(gòu),因此,組件的組合是一種構(gòu)建用戶界面的有效的方式。這個原則建議避免重復(fù)。只有一個組件符合單一責(zé)任原則并且具有合理的封裝時(shí),它是可復(fù)用的。 翻譯:劉小夕原文鏈接:https://dmitripavlutin.com/7-... 原文的篇幅非常長,不過內(nèi)容太過于吸引我,還是忍不住要翻譯出來。此篇文章對編寫可重用和...

    Amos 評論0 收藏0
  • 可靠React組件設(shè)計(jì)7準(zhǔn)則SRP

    摘要:編寫組件時(shí)要考慮的基本準(zhǔn)則是單一職責(zé)原則。這些更改通常要求組件在隔離狀態(tài)下易于修改這也是的目標(biāo)。解決多重責(zé)任問題需要將分割為兩個組件和。組件之間的通信是通過實(shí)現(xiàn)。更改的唯一原因是修改表單字段。 翻譯:劉小夕原文鏈接:https://dmitripavlutin.com/7-... 原文的篇幅非常長,不過內(nèi)容太過于吸引我,還是忍不住要翻譯出來。此篇文章對編寫可重用和可維護(hù)的React組...

    Charles 評論0 收藏0
  • 函數(shù)式編程與面向?qū)ο缶幊蘙5]:編程本質(zhì)

    摘要:函數(shù)式編程與面向?qū)ο缶幊叹幊痰谋举|(zhì)之劍目錄編程的本質(zhì)讀到兩篇文章寫的不錯綜合摘錄一下復(fù)合是編程的本質(zhì)函數(shù)式程序員在洞察問題方面會遵循一個奇特的路線。在面向?qū)ο缶幊讨校惢蚪涌诘穆暶骶褪潜砻妗? 函數(shù)式編程與面向?qū)ο缶幊蘙5]:編程的本質(zhì) 之劍 2016.5.6 01:26:31 編程的本質(zhì) 讀到兩篇文章,寫的不錯, 綜合摘錄一下 復(fù)合是編程的本質(zhì) 函數(shù)式程序員在洞察問題方面會遵循...

    miracledan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<