react高階組件

1.基本概念

高階組件是React 中一個(gè)很重要且較復(fù)雜的概念又固,高階組件在很多第三方庫(kù)(如Redux)中都被經(jīng)常使用,即使你開發(fā)的是普通的業(yè)務(wù)項(xiàng)目煤率,用好高階組件也能顯著提高你的代碼質(zhì)量仰冠。高階組件的定義是類比于高階函數(shù)的定義。高階函數(shù)接收函數(shù)作為參數(shù)蝶糯,并且返回值也是一個(gè)函數(shù)洋只。類似的,高階組件接收React組件作為參數(shù),并且返回一個(gè)新的React組件木张。高階組件本質(zhì)上也是一個(gè)函數(shù),并不是一個(gè)組件端三,這一點(diǎn)一定要注意
高階組件的主要功能是封裝并分離組件的通用邏輯舷礼,讓通用邏輯在組件間更好地被復(fù)用。

2. 應(yīng)用場(chǎng)景

假設(shè)我有一個(gè)組件郊闯,需要從LocalStorage中獲取數(shù)據(jù)妻献,然后渲染出來。于是我們可以這樣寫組件代碼:

import React, { Component } from 'react'

export default function HOC(WrappedComponent团赁,key) {  //key接收到的參數(shù)
  return class extends Component {
    componentWillMount() {
      let data = localStorage.getItem(key);
        this.setState({data});
    }

    render() {
      // 通過{...this.props} 把傳遞給當(dāng)前組件的屬性繼續(xù)傳遞給被包裝的組件WrappedComponent
      return <WrappedComponent data={this.state.data} {...this.props} />
    }
  }
}

@HOC //裝飾器引入無參數(shù)方式
class MyComponent2 extends Component {  
  render() {
    return <div>{this.props.data}</div>
  }
}

export default HOC(MyComponent2) //不傳參數(shù)
export default  HOC(MyComponent2,'name')  //參數(shù)傳遞

3.進(jìn)階用法

有其他參數(shù)時(shí)的高級(jí)用法

import React, { Component } from 'react'

export default (key) => (WrapperComponent)=>{  //key接收到的參數(shù)
  return class extends Component {
    componentWillMount() {
      let data = localStorage.getItem(key);
        this.setState({data});
    }

    render() {
      // 通過{...this.props} 把傳遞給當(dāng)前組件的屬性繼續(xù)傳遞給被包裝的組件WrappedComponent
      return <WrappedComponent data={this.state.data} {...this.props} />
    }
  }
}

@HOC //裝飾器引入無參數(shù)方式
@HOC('name')  //傳遞參數(shù)
class MyComponent2 extends Component {  
  render() {
    return <div>{this.props.data}</div>
  }
}

export default HOC()(MyComponent2) //不傳參數(shù)
export default HOC('name')(MyComponent2)  //參數(shù)傳遞

react-redux中的connect就是這種用法
connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])

4.高階組件與父組件

高階組件是一個(gè)函數(shù)育拨,函數(shù)關(guān)注的是邏輯;父組件是一個(gè)組件欢摄,組件主要關(guān)注的是UI/DOM熬丧。

  • 如果邏輯是與DOM直接相關(guān)的,那么這部分邏輯適合放到父組件中實(shí)現(xiàn)怀挠;
  • 如果邏輯是與DOM不直接相關(guān)的析蝴,那么這部分邏輯適合使用高階組件抽象,如數(shù)據(jù)校驗(yàn)绿淋、請(qǐng)求發(fā)送等闷畸。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市吞滞,隨后出現(xiàn)的幾起案子佑菩,更是在濱河造成了極大的恐慌,老刑警劉巖裁赠,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殿漠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡佩捞,警方通過查閱死者的電腦和手機(jī)凸舵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來失尖,“玉大人啊奄,你說我怎么就攤上這事∠瞥保” “怎么了菇夸?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)仪吧。 經(jīng)常有香客問我庄新,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任择诈,我火速辦了婚禮械蹋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羞芍。我一直安慰自己哗戈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布荷科。 她就那樣靜靜地躺著唯咬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畏浆。 梳的紋絲不亂的頭發(fā)上胆胰,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音刻获,去河邊找鬼蜀涨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蝎毡,可吹牛的內(nèi)容都是我干的勉盅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼顶掉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼草娜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痒筒,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤宰闰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后簿透,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體移袍,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年老充,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了葡盗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啡浊,死狀恐怖觅够,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巷嚣,我是刑警寧澤喘先,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站廷粒,受9級(jí)特大地震影響窘拯,放射性物質(zhì)發(fā)生泄漏红且。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一涤姊、第九天 我趴在偏房一處隱蔽的房頂上張望暇番。 院中可真熱鬧,春花似錦思喊、人聲如沸壁酬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至和措,卻和暖如春庄呈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背派阱。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工诬留, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贫母。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓文兑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親腺劣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绿贞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容