摘要:等價于是一個返回函數的函數就是個高階函數返回的函數就是一個高階組件,該高階組件返回一個與關聯起來的新組件的也是一樣的總結一下高階組件是對代碼進行更高層次重構的好方法,如果你想精簡你的和生命周期方法,那么高階組件可以幫助你提取出可重用的函數。
談到react,我們第一個想到的應該是組件,在react的眼中可真的是萬物皆組件。就連我們獲取數據用到的axios也可以用組件來表示...比如,我們可以這樣封裝
{}} /* called on success of axios request - optional */ onLoading={()=>{}} /* called on start of axios request - optional */ onError=(error)=>{} /* called on error of axios request - optional */ />
在項目中我們可以這樣寫
import { AxiosProvider, Request, Get, Delete, Head, Post, Put, Patch, withAxios } from "react-axios" ... render() { return () }{(error, response, isLoading, makeRequest, axios) => { if(error) { return ( Something bad happened: {error.message}) } else if(isLoading) { return (Loading...) } else if(response !== null) { return ({response.data.message}) } return (Default message before request is made.) }}
有點過分了...至少我是覺得還是要根據個人的代碼習慣來吧,如果所有組件都是這么處理請求的,包括一些簡單的get請求,我覺得真的沒這個必要,并且我們的一些通用API也不太好統一管理
那么,高階組件到底是什么?
a higher-order component is a function that takes a component and returns a new component.
右鍵翻譯 ------> 高階組件就是一個函數,且該函數接受一個組件作為參數,并返回一個新的組件。
嗯,看起來就是這么簡單,其實用起來也是
1、具體來說一下,我們先用高階函數來舉個例子,一個 showUserPermit, 一個showUserVipInfo,兩個函數先從localStorage讀取了userVIP,之后針對userVIP做了一些處理。
function showUserPermit() { let vip = localStorage.getItem("u_V"); console.log(`您可以享受的${u_V}的特權...`); } function showUserVipInfo() { let vip = localStorage.getItem("u_V"); console.log(`您當前VIP等級為${u_V},升級立刻...`); } showUserPermit(); showUserVipInfo();
2、我們發現了兩個API中有兩個完全一樣的代碼,很冗余,這樣不好,我們改一下吧
function showUserPermit(u_V) { console.log(`您可以享受的${u_V}的特權...`); } function showUserVipInfo(u_V) { console.log(`您當前VIP等級為${u_V},升級立刻...`); }
3、這樣寫看上去確實簡單了一些,但是這兩個API要想保證功能完全必須依賴參數u_V,所有在調用這兩個函數之前我們都必須要拿到這個參數,這樣未免有點耦合性,我們再次改造
function showUserPermit(u_V) {
console.log(`您可以享受的${u_V}的特權...`); } function showUserVipInfo(u_V) { console.log(`您當前VIP等級為${u_V},升級立刻...`); } function wrapU_V(wrappedFunc) { let newFunc = () => { let vip = localStorage.getItem("u_V"); wrappedFunc(vip); }; return newFunc; } module.exports = { showUserPermit: wrapU_V(showUserPermit), showUserVipInfo: wrapU_V(showUserVipInfo) }
4、wrapU_V就是一個沒有任何副作用的高階函數,那么他的意義是什么?又做了什么?它幫我們處理了u_V,并且調用了目標函數(函數參數),這樣當你再次使用導出的showUserPermit的時候根本不必要去關心u_V高低是怎么來的,到底需求什么外部條件,你只要知道它能幫我實現我想要做的事情就可以了!同時省去了每一次調用前都先要看一下它的參數是什么?怎么來?甚至根本不用關心wrapU_V內部是如何實現的,Array.map,setTimeout都可以稱為高階函數
高階組件
高階組件就是一個沒有副作用的純函數,對就是一個函數
我們將上面的例子用component來重構一下
import React, {Component} from "react" ... class showUserPermit extends Component { constructor(props) { super(props); this.state = { VIP: "" } } componentWillMount() { let VIP = localStorage.getItem("u_V"); this.setState({ VIP }) } render() { return (showUserPermit... {this.state.VIP}) } } export default showUserPermit; /* - */ import React, {Component} from "react" ... class showUserVipInfo extends Component { constructor(props) { super(props); this.state = { VIP: "" } } componentWillMount() { let VIP = localStorage.getItem("u_V"); this.setState({ VIP }) } render() { return (showUserVipInfo... {this.state.VIP}) } } export default showUserVipInfo;
剛才發現的問題都可以映射在這兩個組件里了
按照上面的思路我們做一個處理
import React, {Component} from "react" module.exports = Wrap: (WrappedComponent) => { class reComponent extends Component { constructor() { super(); this.state = { VIP: "" } } componentWillMount() { let VIP = localStorage.getItem("u_V"); this.setState({ VIP }) } render() { return} } return reComponent }
再來簡化一下 showUserVipInfo和showUserPermit組件
import React, {Component} from "react"; import {Wrap} as templete from "wrapWithUsername"; class showUserPermit extends Component { render() { return (showUserPermit {this.props.username}) } } showUserPermit = templete(showUserPermit); export default showUserPermit; /*--*/ import React, {Component} from "react"; import {Wrap} as templete from "wrapWithUsername"; class showUserVipInfo extends Component { render() { return (showUserVipInfo {this.props.username}) } } showUserPermit = templete(showUserPermit); export default showUserVipInfo;
并且高階組件中可以分布多個目標組件,舉一個我們項目中的例子
這里面右上角的時間選擇組件以及echarts組件是兩種不同身份特有的一些行為和樣式,其它的完全是一樣的,包括state以及共用方法都一模一樣。上代碼
render() { return ()...<**GenTimerComponent** receiveTimeChange={this.getData.bind(this)}/>...<**EchartsComponent** chartData={this.state.chartData}/>
其中GenTimerComponent,和EchartsComponent都是目標組件,我們這樣導出
豁然開朗了吧,其實就是把兩個組件相同的地方或者都可能用到的地方抽離出來,說句題外話,其實本來是"高階組件"嵌套了目標組件,但是重新生成的新組建反倒是繼承了目標組件,看起來是一種控制反轉,和Vue中的extend+minix也比較像,通過繼承目標組件,除了一些靜態方法,包括生命周期,state,fun,我們都可得到
現在理解react-redux的connect函數~
把redux的state和action創建函數,通過props注入給了Component。
你在目標組件Component里面可以直接用this.props去調用redux state和action創建函數了。
ConnectedComment = connect(mapStateToProps, mapDispatchToProps)(Component);
等價于
// connect是一個返回函數的函數(就是個高階函數) const enhance = connect(mapStateToProps, mapDispatchToProps); // 返回的函數就是一個高階組件,該高階組件返回一個與Redux store // 關聯起來的新組件 const ConnectedComment = enhance(Component);
antd的Form也是一樣的
const WrappedNormalLoginForm = Form.create()(NormalLoginForm);
總結一下: 高階組件是對React代碼進行更高層次重構的好方法,如果你想精簡你的state和生命周期方法,那么高階組件可以幫助你提取出可重用的函數。一般來說高階組件能完成的用組件嵌套+繼承也可以,用嵌套+繼承的方式理解起來其實更容易一點,特別是去重構一個復雜的組件時,通過這種方式往往更快,拆分起來更容易。至于到底用哪個最佳還要具體看業務場景,歡迎交流探討
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/54220.html
摘要:等價于是一個返回函數的函數就是個高階函數返回的函數就是一個高階組件,該高階組件返回一個與關聯起來的新組件的也是一樣的總結一下高階組件是對代碼進行更高層次重構的好方法,如果你想精簡你的和生命周期方法,那么高階組件可以幫助你提取出可重用的函數。 談到react,我們第一個想到的應該是組件,在react的眼中可真的是萬物皆組件。就連我們獲取數據用到的axios也可以用組件來表示...比如,我...
摘要:等價于是一個返回函數的函數就是個高階函數返回的函數就是一個高階組件,該高階組件返回一個與關聯起來的新組件的也是一樣的總結一下高階組件是對代碼進行更高層次重構的好方法,如果你想精簡你的和生命周期方法,那么高階組件可以幫助你提取出可重用的函數。 談到react,我們第一個想到的應該是組件,在react的眼中可真的是萬物皆組件。就連我們獲取數據用到的axios也可以用組件來表示...比如,我...
摘要:等價于是一個返回函數的函數就是個高階函數返回的函數就是一個高階組件,該高階組件返回一個與關聯起來的新組件的也是一樣的總結一下高階組件是對代碼進行更高層次重構的好方法,如果你想精簡你的和生命周期方法,那么高階組件可以幫助你提取出可重用的函數。 談到react,我們第一個想到的應該是組件,在react的眼中可真的是萬物皆組件。就連我們獲取數據用到的axios也可以用組件來表示...比如,我...
摘要:等價于是一個返回函數的函數就是個高階函數返回的函數就是一個高階組件,該高階組件返回一個與關聯起來的新組件的也是一樣的總結一下高階組件是對代碼進行更高層次重構的好方法,如果你想精簡你的和生命周期方法,那么高階組件可以幫助你提取出可重用的函數。 談到react,我們第一個想到的應該是組件,在react的眼中可真的是萬物皆組件。就連我們獲取數據用到的axios也可以用組件來表示...比如,我...
摘要:在項目中用好高階組件,可以顯著提高代碼質量。高階組件的定義類比于高階函數的定義。高階函數接收函數作為參數,并且返回值也是一個函數。 React 深入系列,深入講解了React中的重點概念、特性和模式等,旨在幫助大家加深對React的理解,以及在項目中更加靈活地使用React。 1. 基本概念 高階組件是React 中一個很重要且比較復雜的概念,高階組件在很多第三方庫(如Redux)中都...
閱讀 3070·2021-11-22 13:54
閱讀 834·2021-11-04 16:08
閱讀 4463·2021-10-11 11:09
閱讀 3597·2021-09-22 16:05
閱讀 910·2019-08-30 15:54
閱讀 387·2019-08-30 15:44
閱讀 594·2019-08-30 14:05
閱讀 1014·2019-08-30 12:46