React高階元件和高階函式

2021-09-29 18:59:22 字數 4711 閱讀 7563

高階元件(hoc)是react中對元件邏輯進行重用的高階技術,但高階元件本身並不是react api,它只是一種模式,這種模式是由react自身組合性質必然產生的

具體而言,高階元件就是乙個函式,且該函式接受乙個元件作為引數,並返回乙個新的元件

const enhancedcomponent =

higherordercomponent

;

高階元件在react第三方中很常見,比如react-redux中的connect方法和relay的createcontainer

舉簡單例子

onelist元件

import react from

'react'

;class

onelist

extends

react.component

}componentwillmount()

);}render()

<

/h2>

<

/div>)}

}export

default onelist;

otherlist元件

import react from

'react'

;class

otherlist

extends

react.component

}componentwillmount()

);}render()

<

/h2>

<

/div>)}

}export

default otherlist;

我們看到這兩個元件名稱不同之外,大量的**都是一樣的,我們可以把通用的**提取出來,可以用高階元件上場,以下是個高階元件處理onelist和otherlist

import react from

'react'

;const

highordercomponent

=(wrapcomponent,title)

=>

}componentwillmount()

);}render()

<

/legend>

>

<

/wrapcomponent>

<

/div>)}

}}export

default highordercomponent;

如何運用上面的元件

import react from

'react'

;import highordercomponent from

'./highordercomponent.jsx'

;class

onelist

extends

react.component

<

/h2>

<

/div>)}

}const highorderone =

highordercomponent

(sechoc,

'second page');

export

default highorderone

highorderone 就是乙個經過高階元件之後生成乙個全新的元件

官網上例子

commentlist元件

class

commentlist

extends

react.component;}

componentdidmount()

componentwillunmount()

handlechange()

);}render()

key=

/>))

}<

/div>);

}}

blogpost元件

class

blogpost

extends

react.component;}

componentdidmount()

componentwillunmount()

handlechange()

);}render()

/>;}

}

commentlist 和 blogpost 元件並不相同 —— 他們呼叫了 datasource 的不同方法獲取資料,並且他們渲染的輸出結果也不相同。但是,他們的大部分實現邏輯是一樣的

我們可以建立乙個withsubscription元件,把公共部分封裝起來,withsubscription可以接受乙個元件引數和資料引數

// 函式接受乙個元件引數……

function

withsubscription;}

componentdidmount()

componentwillunmount()

handlechange()

);}render()

/>;}

};}

使用高階元件,生成全新的乙個元件

import react form 'react'

;import withsubscription =

'./withsubscription .jsx'

//commentlist

class

commentlist

extends

react.component

key=

/>))

}<

/div>);

}}//blogpost

class

blogpost

extends

react.component

/>;}

}const commentlistwithsubscription =

withsubscription

( commentlist,

(datasource)

=> datasource.

getcomments()

);const blogpostwithsubscription =

withsubscription

( blogpost,

(datasource, props)

=> datasource.

getblogpost

(props.id));

export

commentlistwithsubscription,blogpostwithsubscription兩個元件就是經過高階元件之後生成乙個全新的元件。

使用高階元件約定和注意事項

render()

=this

.props;

// 向包裹元件注入props屬性,一般都是高階元件的state狀態

// 或例項方法

const injectedprop = somestateorinstancemethod;

// 向包裹元件傳遞props屬性

return

( injectedprop=

/>);

}

3.最大化使用組合

4.包裝顯示名字以便於除錯

注意事項:

1.不要在render函式中使用高階元件

2.必須將靜態方法做拷貝

//當使用高階元件包裝元件,原始元件被容器元件包裹,也就意味著新元件會丟失原始元件的所有靜態方法。

// 定義靜態方法

staticmethod

=function()

// 使用高階元件

const enhancedcomponent =

enhance

;// 增強型元件沒有靜態方法

typeof enhancedcomponent.staticmethod ===

'undefined'

// true

//解決辦法,將原始元件的所有靜態方法全部拷貝給新元件

function

enhance

// 必須得知道要拷貝的方法 :(

return enhance;

}//你可以使用hoist-non-react-statics來幫你自動處理,它會自動拷貝所有非react的靜態方法:

import hoistnonreactstatic from

'hoist-non-react-statics'

;function

enhance

hoistnonreactstatic

;return enhance;

}//另外乙個可能的解決方案就是分別匯出元件自身的靜態方法。

// 替代……

mycomponent.somefunction = somefunction;

export

default mycomponent;

// ……分別匯出……

export

;// ……在要使用的元件中匯入

import mycomponent,

from

'./mycomponent.js'

;

3.refs屬性不能傳遞

React高階元件

想想以前用原生和jquery的專案,上千行的code映入眼簾,瞬間有種昏死過去的衝動。難以維護,改乙個bug可能出現n個bug,真的是很痛苦。於是乎元件化成為了當前前端開發的主流技術。angular vue和react很好的幫我們實現了元件化。但是我們常常也會遇到一種情況,就是兩個元件往往有很多的重...

react高階元件

基本概念 函式可以作為引數被傳遞 函式可以作為返回值輸出 元件作為引數被傳遞,返回值是乙個元件 高階元件是乙個函式 案例 將a元件作為公共元件,bc元件作為a函式的引數,來共享顯示a元件 此處紅框是a元件,紅框裡左邊內容為b元件,右邊內容為c元件 1.建立公共的a元件 將元件a封裝成乙個函式,接收乙...

React 高階元件

高階元件 high order component,hoc 輸入 react 元件 輸出 react 元件 高階元件的作用主要是用來加強元件,通過把基礎元件拆分成很小的粒度,通過高階元件進行增強並返回,以此提高復用性。比如需要開發乙個訊息框,一開始只需要乙個模態框能夠顯示訊息就可以。後來需要多增加 ...