今天學習了react高階元件,剛接觸react學習起來還是比較困難,和大家分享一下今天學習的知識吧,另外缺少的地方歡迎補充哈哈
高階元件(Higher Order Components,簡稱:HOC)
是 React 中用於重用元件邏輯的高階技術, 它本身不是react中的元件, 而是一個函式,
這個函式接受一個react元件作為引數,並返回一個新元件, 實現了對原有元件的增強和優化,
可以對原有元件中的state, props和邏輯執行增刪改操作, 一般用於程式碼重用和元件增強優化。
高階元件的使用場景
1, 需要程式碼重用時, react如果有多個元件都用到了同一段邏輯, 這時,就可以把共同的邏輯部分提取出來,
利用高階元件的形式將這段邏輯整合到每一個元件中, 從而減少程式碼的邏輯重複。
2, 需要元件增強優化時, 比如我們在專案中使用的元件有些不是自己寫的, 而是從網上C下來的,
但是第三方寫的元件可能比較複雜, 有時不能完全滿足需求, 但第三方元件不易修改, 此時也可以用高階元件,
在不修改原始元件的前提下, 對元件新增滿足實際開發需求的功能。
高階元件的實現方式
高階元件的實現方式有兩種:
1, 屬性代理: 通過建立新組建來包裹原始元件, 把原始元件作為新組建的子元件渲染
功能: 可實現對原始元件的 props資料更新 和 元件模板更新。
下面是實現屬性代理的程式碼片段:
(1), 新建高階元件檔案 MyHOC.jsx
(2), 在檔案中建立函式 函式的引數是一個元件OldCom(引數可以自定義), 函式的返回值也是一個元件 NewCom(自定義)
function MyHoc(OldCom){ return class NewCom extends React.Component{ render(){ let newProps = { age: 10, sex: '男' } return ( <OldCom {...newProps} ></OldCom> ) } } } // 匯出高階元件函式 export default MyHOC; // 屬性代理: 通過建立新組建來包裹原始元件, 把原始元件作為新組建的子元件渲染 // 功能: 可實現對原始元件的 props資料更新 和 元件模板更
2, 反向繼承: 通過建立新組建繼承自原始元件, 把原始元件作為父元件
功能: 可實現對原始元件的state狀態資料更新 和 元件模板更新。
下面是實現反向繼承的程式碼片段:
1 function MyHOC (OldCom){ 2 return class NewCom extends OldCom{ 3 componentDidMount() { 4 this.setState({ name: '李四' }) 5 } 6 render() { 7 return super.render() 8 } 9 } 10 } 11 12 // 匯出高階元件函式 13 export default MyHOC; 14 15 // 反向繼承的state資料, 不能在render中改, 會進入死迴圈 16 // 一般在生命週期函式或自定義函式中更新state
高階元件的渲染劫持
通過高階元件可以把原始元件的模板進行修改和替換
渲染劫持指對一個元件渲染內容的裝飾或修改, 一般通過高階元件來實現,
把一個元件傳入高階元件, 可以對這個元件的模板進行修改後執行渲染,
也可以阻止元件渲染,並修改元件中的資料和邏輯。
下面是渲染劫持的程式碼片段
1 function MyHOC (OldCom){ 2 return class NewCom extends OldCom{ 3 componentDidMount() { 4 this.setState({ name: '李四' }) 5 } 6 render() { 7 // 以下模擬訂單頁渲染, 從狀態管理中取出登入狀態, 加以判斷 8 let isLogin = true; 9 if(isLogin){ 10 11 // 此時,要渲染父元件,就要用父元件物件super渲染 12 return super.render() 13 }else{ 14 this.props.history.push("/login") 15 return null 16 } 17 } 18 } 19 } 20 export default MyHOC
渲染劫持的應用
一般用於一些需要登入狀態的頁面, 在路由請求渲染頁面(如訂單頁)之前,
使用高階元件判斷是否已登入,如果已登入,返回訂單頁模板, 如果沒有登入,返回空,並跳轉到登入頁
匯入
最後在使用用高階元件的時候,別忘了匯入元件,
路徑改成你檔案路徑匯入:
import 自定義名稱 from "高階元件所在路徑"