1.什么是HOC?
HOC(Higher-order component)是一種React 的進階使用方法,只要還是為了便於組件的復用。強調一點,HOC本身並不是 React API, 它就是一個方法,一個接收一個組件作為參數,返回一個增強的組件的方法。
概括的講,HOC能夠實現:
1. 代碼復用,代碼模塊化
2. 渲染劫持, 操作state
3. Props 增刪改
HOC的實現方式
在這節中我們將學習兩種主流的在 React 中實現高階組件的方法:屬性代理(Props Proxy)和 反向繼承(Inheritance Inversion)。
基於反向繼承(Inheritance Inversion, 縮寫II)的方式
反向繼承的實現為:
返回的高階組件類(Enhanced)繼承了 WrappedComponent。這被叫做反向繼承是因為 WrappedComponent 被動地被 Enhancer 繼承,而不是 WrappedComponent 去繼承 Enhancer。
反向繼承允許高階組件通過this關鍵詞獲取 WrappedComponent,意味着它可以獲取到 state,props,組件生命周期(component lifecycle)鈎子,以及渲染方法(render)。
使用高階組件遇到的問題
靜態方法丟失
當使用高階組件包裹原始組件,返回的新組件會丟失原始組件的所有靜態方法。解決方案:
1. 手動拷貝所有靜態方法給新組件;(不推薦)
2. 使用hoist-non-react-statics來幫你自動處理,它會自動拷貝所有非React的靜態方法;(react-router 里withRouter就使用了這個包)
Refs屬性不能傳遞
解決方案:
新組建傳遞一個ref 回調函數屬性給原始組件,也就是將ref組件綁定到新組件上;如:
<Enhancer getRef={ref => this.wrappedC = ref} />