首頁  >  文章  >  web前端  >  react高階元件是什麼意思

react高階元件是什麼意思

WBOY
WBOY原創
2022-04-18 10:10:463809瀏覽

在react中,高階元件是一個函數,是用於重複使用元件邏輯的高階技術;高階元件用來接受一個元件作為參數,傳回一個新的元件,這個新的元件會使用傳給它的元件作為子元件,可以用屬性代理和反向繼承兩種方法來實現高階元件。

react高階元件是什麼意思

本教學操作環境:Windows10系統、react17.0.1版、Dell G3電腦。

react高階元件是什麼意思

高階元件是一個函數(而不是元件),它接受一個元件作為參數,並傳回一個新的元件。這個新的元件會使用你傳給它的元件作為子元件 -引用自React.js小書

高階元件(Higher-Order Components)是 React 中用於重複使用元件邏輯的高階技術。 HOC 本身不是 React API 的一部分。它們是從 React 構思本質中浮現出來的一種模式。

在我們專案中使用react-redux框架的時候,有一個connect的概念,這裡的connect其實就是一個高階元件。也包括類似react-router-dom中的withRouter的概念

react高階元件是什麼意思

#建構一個簡單的hoc

function hello (){
    console.log("hello i  love react ")
}
function hoc(fn){
    return ()=>{
          console.log("first");
          fn();
          console.log("end");
    }
}
hello = hoc(hello);
hello();

實作高階元件的方法

實作高階元件的方法有以下兩種:

  • #屬性代理。高階元件透過唄包覆的React元件來操作props

  • 反向繼承。高階元件繼承於被包裹的React元件

接下來我們分別來闡述這兩種方法。

屬性代理

屬性代理程式是我們react中常見高階元件的實作方法,我們透過一個例子來說明:

import React,{Component} from 'react';
const MyContainer = (WraooedComponent) => 
    class extends Component {
        render(){
            return <WrappedComponent {...this.props} />
        }
    }

從這裡看到最重要部分是render 方法中傳回了傳入WrappedComponent的React元件。這樣,我們就可以透過高階組件來傳遞props。這種方法即為屬性代理。

自然,我們想要使用MyContainer這個高階元件就變得非常容易:

import React,{Component} from &#39;react&#39;;
class MyComponent extends Component{
    //...
}
export default MyContainer(MyComponent);

這樣元件就可以一層層地作為參數被調用,原始元件就具備了高階組件對它的修飾。就這麼簡單,保持單一元件封裝性的同時也保留了易用性。當然,我們也可以用decorator來轉換。

當使用屬性代理建立高階元件時,呼叫順序不同於mixin。上述執行生命週期的過程類似於堆疊呼叫:

didmount ->HOC didmount ->(HOCs didmount)->(HOCs will unmount)->HOC will unmount -> unmount

反向繼承

#另一種建構高階元件的方法稱為反向繼承,從字面意思來看,它一定與繼承性有關。我們同樣來看一個簡單的實作。

const MyContainer = (WrappedComponent)=>{
    class extends WrappedComponent {
        render(){
            return super.render();
        }
    }
}

如上程式碼。高階元件傳回的元件繼承於 WrappedComponent 。因為被動地繼承了 WrappedComponent,所有的呼叫都會反向,這也是種方法的由來。

這種方法與屬性代理不太一樣。它透過繼承WrappedComponent來實現,方法可以透過super來順序呼叫。因為依賴繼承機制。 HOC的呼叫順序和隊列是一樣的。

didmount -> HOC didmount ->(HOCs didmount) -> will unmount ->HOC will unmount ->(HOCs will unmount)

在反向繼承方法中,高階元件可以使用 WrappedComponent 引用,這表示它可以使用 WrappedComponent 的state 、props。生命週期和render方法。但它不能保證完整的子組件樹被解析。它有兩個比較大的特點,下面我們展開來講一講。

渲染劫持

渲染劫持就是指的是高階元件可以控制 WrappedComponent的渲染過程,並且渲染各種各樣的結果。我們可以在這個過程中在任何React元素輸出的結果中讀取、增加、修改、刪除props,或讀取或修改React元素樹,或條件顯示。又或用樣式包覆元素樹

控制state

高階元件可以讀取、修改或刪除WrappedComponent實例中的state,如果需要的話,也可以增加state。

元件命名

當包裹高階元件時,我們失去了原始 WrappedComponent的displayName,而元件名字是方便我們開發與除錯的重要屬性。

元件參數

有時,我們呼叫高階元件需要傳入一些參數,這可以用非常簡單的方式來實現。

import React from &#39;react&#39;
function HOCFactoryFactory(...params){
    return function HOCFactory(WrappedComponent){
        return class HOC extends Component{
            render(){
                return <WrappedComponent {...this.props} />
            }
        }
    }
}

當你使用的時候,可以這麼寫:

HOCFactoryFactory(params)(WrappedComponent)
//or
@HOCFactoryFactory(params)class WrappedComponent extends React.Component{}

這也是利用了函數式程式設計的特徵。可見,在React抽象的過程中,處處可見它的影子。

推薦學習:《react影片教學

以上是react高階元件是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn