從高階函數(shù)到高階組件

介紹

高階組件(HOC)是 React 中用于復用組件邏輯的一種高級技巧级零。HOC 自身不是 React API 的一部分断医,它是一種基于 React 的組合特性而形成的設計模式。

React 官網(wǎng)對高階組件的定義描述得很清楚奏纪。高階組件不是 React 所獨有的鉴嗤,它只是一種設計模式,簡單來說就是為了復用代碼而對組件進行封裝序调。

要搞清楚高階組件醉锅,先得了解下高階函數(shù),這樣一類比下就很容易理解了发绢。

  • 高階函數(shù):函數(shù)的參數(shù)或者返回值為函數(shù)硬耍,這個函數(shù)就是高階函數(shù)
  • 高階組件:函數(shù)的參數(shù)為組件边酒,返回一個組件经柴,這個函數(shù)就是高階組件

高階函數(shù)

高階函數(shù)(Higher Order Function)墩朦,按照定義坯认,是至少滿足下列一個條件的函數(shù):

  • 函數(shù)作為參數(shù)傳入
  • 返回值為一個函數(shù)

參數(shù)為函數(shù)的例子:

let pow = function square(x) {
    return x * x;
};

let array = [1, 2, 3, 4, 5, 6, 7, 8];
let newArr = array.map(pow); //直接傳入一個函數(shù)
let newArr = array.map((item) => {return item * item}); //傳入一個箭頭函數(shù)
//返回的一個函數(shù)
alert(newArr); // [1, 4, 9, 16, 25, 36, 49, 64]

返回值為函數(shù)的例子:

/* 函數(shù)柯里化 */
let add = function(x) {
    return function(y) {
      return function(z){
        return x+y+z;
      };
    };
};

高階組件

高階組件(Higher Order Component),是滿足下列所有個條件的函數(shù):

  • 組件作為參數(shù)傳入
  • 返回值為一個組件

包裹組件

// A/index.js

import React from 'react';
import './index.css';

// 定義一個函數(shù)
// 傳入一個組件作為參數(shù)
function A(WrappedComponent) {
  // 返回一個組件
  return class A extends React.Component {
    constructor (props) {
      super(props);
      this.state = {};
    }

    render () {
      return (
        <div className="a-container">
           <div className="header">
             <div className="title">提示</div>
             <div className="close">X</div>
           </div>
           <div>
             <!-- 在這里使用一下 -->
             <WrappedComponent />
           </div>
         </div>
      )
    }
  }
}

export default A

內部組件

// B/index.js

import React from 'react';
import A from '../A/index.js';
import './index.css';


class B extends React.Component {
    render() {
        return (
            <div className="wrap">
                <img src="https://xxx.xxx.png" alt="" />
            </div>
        );
    }
}

<!--調用A()方法去包裹我們的B組件氓涣。-->
export default A(B);
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末鹃操,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子春哨,更是在濱河造成了極大的恐慌荆隘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赴背,死亡現(xiàn)場離奇詭異椰拒,居然都是意外死亡,警方通過查閱死者的電腦和手機凰荚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門燃观,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人便瑟,你說我怎么就攤上這事缆毁。” “怎么了到涂?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵脊框,是天一觀的道長颁督。 經(jīng)常有香客問我,道長浇雹,這世上最難降的妖魔是什么沉御? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮昭灵,結果婚禮上吠裆,老公的妹妹穿的比我還像新娘。我一直安慰自己烂完,他們只是感情好试疙,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抠蚣,像睡著了一般效斑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柱徙,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天缓屠,我揣著相機與錄音,去河邊找鬼护侮。 笑死敌完,一個胖子當著我的面吹牛,可吹牛的內容都是我干的羊初。 我是一名探鬼主播滨溉,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼长赞!你這毒婦竟也來了晦攒?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤得哆,失蹤者是張志新(化名)和其女友劉穎脯颜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贩据,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡栋操,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了饱亮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矾芙。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖近上,靈堂內的尸體忽然破棺而出剔宪,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布葱绒,位于F島的核電站感帅,受9級特大地震影響,放射性物質發(fā)生泄漏哈街。R本人自食惡果不足惜留瞳,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一拒迅、第九天 我趴在偏房一處隱蔽的房頂上張望骚秦。 院中可真熱鬧,春花似錦璧微、人聲如沸作箍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胞得。三九已至,卻和暖如春屹电,著一層夾襖步出監(jiān)牢的瞬間阶剑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工危号, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留牧愁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓外莲,卻偏偏與公主長得像猪半,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子偷线,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容

  • 高階函數(shù):高階函數(shù)只要滿足參數(shù)或返回值為函數(shù)就可以成為高階函數(shù)磨确,而非一定要同時滿足才成立。 高階組件:高階組件是以...
    小泡_08f5閱讀 1,133評論 0 0
  • React組件其中一個好處便是可以實現(xiàn)組件的重用声邦。一個組件一旦定義好之后可以用在不同的UI場景之下乏奥。在日常的開發(fā)過...
    ableF閱讀 763評論 2 1
  • 高階組件定義 高階組件就是一個函數(shù),且該函數(shù)接受一個組件作為參數(shù)亥曹,并返回一個新的組件英融。 高階函數(shù)定義 高階函數(shù):高...
    Poppy11閱讀 237評論 0 0
  • 一、組件 (1) 函數(shù)組件 如果你想寫的組件只包含一個 render 方法歇式,并且不包含 state驶悟,那么使用函數(shù)組...
    我有我閱讀 1,870評論 0 0
  • 柯里化 Currying 讓所有函數(shù)只接受一個參數(shù)【單一參數(shù)】 單一參數(shù)有什么意義 那么怎么支持兩個參數(shù) 用對象...
    YQY_苑閱讀 1,122評論 1 1