Day10. 高階組件

1. 認(rèn)識高階函數(shù)

  • 什么是高階組件呢?


    認(rèn)識高階函數(shù).png
  • 高階函數(shù): 接收一個或多個函數(shù)作為輸入, 輸出一個函數(shù).
  • 高階組件: Higher-Order Components, 簡稱HOC
  • 官方定義: 高階組件是參數(shù)為組件, 返回值為新組件的函數(shù).

2. 高階組件的定義

  • 高階組件的調(diào)用過程類似于這樣:
const EnhancedComponent = higherOrderComponent(WrappedComponent);
  • 定義一個高階組件
function enhanceComponent(WrappedComponent) {
  return class NewComponent extends PureComponent {
    render() {
      return <WrappedComponent/>
    }
  }
}

const EnhanceComponent = enhanceComponent(App);

export default EnhanceComponent;
這里的名字隨便起.png
嵌套關(guān)系改變.png
  • 類表達(dá)式, 可以省略NewComponent


    顯示的名字.png
  • 所有的組件都可以起一個展示名稱, 開發(fā)中很少重新定義名稱NewComponent.displayName = "Why";
  • 給經(jīng)過處理的高階組件傳遞屬性
高階組件.png
  • 高階組件并不是React API的一部分, 他是基于React的組合特性而形成的設(shè)計模式;
  • displayName是給組件改名字
  • 做了一個劫持, 可以做很多操作.
  • 高階組件在hooks出現(xiàn)后用的比較少
  • redus蝎土、路由, 很多東西用的都是高階組件

3. 高階組件的應(yīng)用

1. 增強(qiáng)props

增強(qiáng).png
  • context共享數(shù)據(jù)


    context共享.png

2. 渲染判斷鑒權(quán)

  • 在開發(fā)中, 我們可能遇到這樣的場景:
    • 某些頁面是必須用戶登錄成功才能進(jìn)行進(jìn)入;
    • 如果用戶沒有登錄成功, 那么直接跳轉(zhuǎn)到登錄頁面;


      鑒權(quán).png

3. 對生命周期進(jìn)行劫持

生命周期劫持.png
  • 打印渲染的耗時
  • 不安全的生命周期函數(shù), UNSAFE_componentWillMount
  • 早期的時候支持mixin: 混入
  • hooks一定是未來, 真的好用
  • 高階組件增強(qiáng)代碼的復(fù)用性, 寫出優(yōu)雅的代碼
  • 反向繼承,
  • 一邊學(xué)習(xí)一邊看官方文檔, 學(xué)習(xí)方法, 官方文檔中的專業(yè)詞匯, 也會涉及到其他的概念


    不要創(chuàng)建自己的組件基類.png

4. 高階函數(shù)的意義

  • 我們會發(fā)現(xiàn)利用高階組件可以針對某些React代碼進(jìn)行更加優(yōu)雅的處理.
  • 其實早期的React有提供組件之間的一種復(fù)用方式是mixin, 目前已經(jīng)不再建議使用:
    • Mixin可能會相互依賴, 相互耦合, 不利于代碼維護(hù)
    • 不同的Mixin中的方法可能會相互沖突
    • Mixin非常多時, 組件是可以感知到的, 甚至還要為其做相關(guān)處理, 這樣會給代碼造成滾雪球式的復(fù)雜性
  • 當(dāng)然, HOC也有自己的一些缺陷:
    • HOC需要在原組件上進(jìn)行包裹或者嵌套, 如果大量使用HOC, 將會產(chǎn)生非常多的嵌套, 折讓調(diào)試變得非常困難;
    • HOC可以劫持props, 在不遵守約定的情況下也可能造成沖突;
  • Hooks(React v16.8開始)的出現(xiàn), 是開創(chuàng)性的, 它解決了很多React之前存在的問題
    • 比如this指向問題脖岛、比如hoc的嵌套復(fù)雜度問題等等

5. ref的轉(zhuǎn)發(fā)

  • 在前面我們學(xué)習(xí)ref時講過, ref不能應(yīng)用于函數(shù)式組件
  • forwardRef, 高階組件是一個函數(shù)


    ref的轉(zhuǎn)發(fā).png

6. Portals的使用

  • 某些情況下, 我們希望渲染的內(nèi)容獨立于父組件, 甚至是獨立于當(dāng)前掛載到的DOM元素中(默認(rèn)都是掛載到id為root的DOM元素上的).


    優(yōu)秀的方案.png
image.png

7. Modal組件案例

  • 比如說, 我們準(zhǔn)備開發(fā)一個Modal組件, 它可以將它的子組件渲染到屏幕的中間位置
步驟一:修改index.html添加新的節(jié)點
<div id="root"></div>
<!-- 新節(jié)點 -->
<div id="modal"></div>

步驟二:編寫這個節(jié)點的樣式:
#modal {
  position: fixed;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  background-color: red;
}

步驟三:編寫組件代碼
import React, { PureComponent } from 'react';
import ReactDOM from 'react-dom';

class Modal extends PureComponent {
  constructor(props) {
    super(props);
  }

  render() {
    return ReactDOM.createPortal(
      this.props.children,
      document.getElementById("modal")
    )
  }
}

export default class App extends PureComponent {
  render() {
    return (
      <div>
        <Modal>
          <h2>我是標(biāo)題</h2>
        </Modal>
      </div>
    )
  }
}

coderwhy的React核心技術(shù)與開發(fā)實戰(zhàn)課程鏈接

少年~來做同學(xué)呀~.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赫悄,隨后出現(xiàn)的幾起案子泽示,更是在濱河造成了極大的恐慌抱慌,老刑警劉巖霜威,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酪刀,死亡現(xiàn)場離奇詭異粹舵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)骂倘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門眼滤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人历涝,你說我怎么就攤上這事诅需⊙Γ” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵堰塌,是天一觀的道長赵刑。 經(jīng)常有香客問我,道長场刑,這世上最難降的妖魔是什么般此? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮牵现,結(jié)果婚禮上铐懊,老公的妹妹穿的比我還像新娘。我一直安慰自己瞎疼,他們只是感情好科乎,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贼急,像睡著了一般茅茂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上太抓,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天空闲,我揣著相機(jī)與錄音,去河邊找鬼腻异。 笑死进副,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悔常。 我是一名探鬼主播影斑,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼机打!你這毒婦竟也來了矫户?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤残邀,失蹤者是張志新(化名)和其女友劉穎皆辽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芥挣,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡驱闷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了空免。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片空另。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蹋砚,靈堂內(nèi)的尸體忽然破棺而出扼菠,到底是詐尸還是另有隱情摄杂,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布循榆,位于F島的核電站析恢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秧饮。R本人自食惡果不足惜映挂,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浦楣。 院中可真熱鬧袖肥,春花似錦咪辱、人聲如沸振劳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽历恐。三九已至,卻和暖如春专筷,著一層夾襖步出監(jiān)牢的瞬間弱贼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工磷蛹, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留吮旅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓味咳,卻偏偏與公主長得像庇勃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子槽驶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355