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

介紹

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

React 官網(wǎng)對高階組件的定義描述得很清楚。高階組件不是 React 所獨(dú)有的,它只是一種設(shè)計(jì)模式,簡單來說就是為了復(fù)用代碼而對組件進(jìn)行封裝。

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

  • 高階函數(shù):函數(shù)的參數(shù)或者返回值為函數(shù),這個(gè)函數(shù)就是高階函數(shù)。
  • 高階組件:函數(shù)的參數(shù)為組件,返回一個(gè)組件,這個(gè)函數(shù)就是高階組件。

高階函數(shù)

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

  • 函數(shù)作為參數(shù)傳入
  • 返回值為一個(gè)函數(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); //直接傳入一個(gè)函數(shù)
let newArr = array.map((item) => {return item * item}); //傳入一個(gè)箭頭函數(shù)
//返回的一個(gè)函數(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),是滿足下列所有個(gè)條件的函數(shù):

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

包裹組件

// A/index.js

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

// 定義一個(gè)函數(shù)
// 傳入一個(gè)組件作為參數(shù)
function A(WrappedComponent) {
  // 返回一個(gè)組件
  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

內(nèi)部組件

// 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>
        );
    }
}

<!--調(diào)用A()方法去包裹我們的B組件。-->
export default A(B);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容