摘要:等價于是一個返回函數(shù)的函數(shù)就是個高階函數(shù)返回的函數(shù)就是一個高階組件,該高階組件返回一個與關(guān)聯(lián)起來的新組件的也是一樣的總結(jié)一下高階組件是對代碼進(jìn)行更高層次重構(gòu)的好方法,如果你想精簡你的和生命周期方法,那么高階組件可以幫助你提取出可重用的函數(shù)。
談到react,我們第一個想到的應(yīng)該是組件,在react的眼中可真的是萬物皆組件。就連我們獲取數(shù)據(jù)用到的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.) }}
有點過分了...至少我是覺得還是要根據(jù)個人的代碼習(xí)慣來吧,如果所有組件都是這么處理請求的,包括一些簡單的get請求,我覺得真的沒這個必要,并且我們的一些通用API也不太好統(tǒng)一管理
那么,高階組件到底是什么?
a higher-order component is a function that takes a component and returns a new component.
右鍵翻譯 ------> 高階組件就是一個函數(shù),且該函數(shù)接受一個組件作為參數(shù),并返回一個新的組件。
嗯,看起來就是這么簡單,其實用起來也是
1、具體來說一下,我們先用高階函數(shù)來舉個例子,一個 showUserPermit, 一個showUserVipInfo,兩個函數(shù)先從localStorage讀取了userVIP,之后針對userVIP做了一些處理。
function showUserPermit() { let vip = localStorage.getItem("u_V"); console.log(`您可以享受的${u_V}的特權(quán)...`); } function showUserVipInfo() { let vip = localStorage.getItem("u_V"); console.log(`您當(dāng)前VIP等級為${u_V},升級立刻...`); } showUserPermit(); showUserVipInfo();
2、我們發(fā)現(xiàn)了兩個API中有兩個完全一樣的代碼,很冗余,這樣不好,我們改一下吧
function showUserPermit(u_V) { console.log(`您可以享受的${u_V}的特權(quán)...`); } function showUserVipInfo(u_V) { console.log(`您當(dāng)前VIP等級為${u_V},升級立刻...`); }
3、這樣寫看上去確實簡單了一些,但是這兩個API要想保證功能完全必須依賴參數(shù)u_V,所有在調(diào)用這兩個函數(shù)之前我們都必須要拿到這個參數(shù),這樣未免有點耦合性,我們再次改造
function showUserPermit(u_V) {
console.log(`您可以享受的${u_V}的特權(quán)...`); } function showUserVipInfo(u_V) { console.log(`您當(dāng)前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就是一個沒有任何副作用的高階函數(shù),那么他的意義是什么?又做了什么?它幫我們處理了u_V,并且調(diào)用了目標(biāo)函數(shù)(函數(shù)參數(shù)),這樣當(dāng)你再次使用導(dǎo)出的showUserPermit的時候根本不必要去關(guān)心u_V高低是怎么來的,到底需求什么外部條件,你只要知道它能幫我實現(xiàn)我想要做的事情就可以了!同時省去了每一次調(diào)用前都先要看一下它的參數(shù)是什么?怎么來?甚至根本不用關(guān)心wrapU_V內(nèi)部是如何實現(xiàn)的,Array.map,setTimeout都可以稱為高階函數(shù)
高階組件
高階組件就是一個沒有副作用的純函數(shù),對就是一個函數(shù)
我們將上面的例子用component來重構(gòu)一下
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;
剛才發(fā)現(xiàn)的問題都可以映射在這兩個組件里了
按照上面的思路我們做一個處理
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;
并且高階組件中可以分布多個目標(biāo)組件,舉一個我們項目中的例子
這里面右上角的時間選擇組件以及echarts組件是兩種不同身份特有的一些行為和樣式,其它的完全是一樣的,包括state以及共用方法都一模一樣。上代碼
render() { return ()...<**GenTimerComponent** receiveTimeChange={this.getData.bind(this)}/>...<**EchartsComponent** chartData={this.state.chartData}/>
其中GenTimerComponent,和EchartsComponent都是目標(biāo)組件,我們這樣導(dǎo)出
豁然開朗了吧,其實就是把兩個組件相同的地方或者都可能用到的地方抽離出來,說句題外話,其實本來是"高階組件"嵌套了目標(biāo)組件,但是重新生成的新組建反倒是繼承了目標(biāo)組件,看起來是一種控制反轉(zhuǎn),和Vue中的extend+minix也比較像,通過繼承目標(biāo)組件,除了一些靜態(tài)方法,包括生命周期,state,fun,我們都可得到
現(xiàn)在理解react-redux的connect函數(shù)~
把redux的state和action創(chuàng)建函數(shù),通過props注入給了Component。
你在目標(biāo)組件Component里面可以直接用this.props去調(diào)用redux state和action創(chuàng)建函數(shù)了。
ConnectedComment = connect(mapStateToProps, mapDispatchToProps)(Component);
等價于
// connect是一個返回函數(shù)的函數(shù)(就是個高階函數(shù)) const enhance = connect(mapStateToProps, mapDispatchToProps); // 返回的函數(shù)就是一個高階組件,該高階組件返回一個與Redux store // 關(guān)聯(lián)起來的新組件 const ConnectedComment = enhance(Component);
antd的Form也是一樣的
const WrappedNormalLoginForm = Form.create()(NormalLoginForm);
總結(jié)一下: 高階組件是對React代碼進(jìn)行更高層次重構(gòu)的好方法,如果你想精簡你的state和生命周期方法,那么高階組件可以幫助你提取出可重用的函數(shù)。一般來說高階組件能完成的用組件嵌套+繼承也可以,用嵌套+繼承的方式理解起來其實更容易一點,特別是去重構(gòu)一個復(fù)雜的組件時,通過這種方式往往更快,拆分起來更容易。至于到底用哪個最佳還要具體看業(yè)務(wù)場景,歡迎交流探討
作者:易企秀——Yxaw
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/106514.html
摘要:等價于是一個返回函數(shù)的函數(shù)就是個高階函數(shù)返回的函數(shù)就是一個高階組件,該高階組件返回一個與關(guān)聯(lián)起來的新組件的也是一樣的總結(jié)一下高階組件是對代碼進(jìn)行更高層次重構(gòu)的好方法,如果你想精簡你的和生命周期方法,那么高階組件可以幫助你提取出可重用的函數(shù)。 談到react,我們第一個想到的應(yīng)該是組件,在react的眼中可真的是萬物皆組件。就連我們獲取數(shù)據(jù)用到的axios也可以用組件來表示...比如,我...
摘要:等價于是一個返回函數(shù)的函數(shù)就是個高階函數(shù)返回的函數(shù)就是一個高階組件,該高階組件返回一個與關(guān)聯(lián)起來的新組件的也是一樣的總結(jié)一下高階組件是對代碼進(jìn)行更高層次重構(gòu)的好方法,如果你想精簡你的和生命周期方法,那么高階組件可以幫助你提取出可重用的函數(shù)。 談到react,我們第一個想到的應(yīng)該是組件,在react的眼中可真的是萬物皆組件。就連我們獲取數(shù)據(jù)用到的axios也可以用組件來表示...比如,我...
摘要:等價于是一個返回函數(shù)的函數(shù)就是個高階函數(shù)返回的函數(shù)就是一個高階組件,該高階組件返回一個與關(guān)聯(lián)起來的新組件的也是一樣的總結(jié)一下高階組件是對代碼進(jìn)行更高層次重構(gòu)的好方法,如果你想精簡你的和生命周期方法,那么高階組件可以幫助你提取出可重用的函數(shù)。 談到react,我們第一個想到的應(yīng)該是組件,在react的眼中可真的是萬物皆組件。就連我們獲取數(shù)據(jù)用到的axios也可以用組件來表示...比如,我...
摘要:等價于是一個返回函數(shù)的函數(shù)就是個高階函數(shù)返回的函數(shù)就是一個高階組件,該高階組件返回一個與關(guān)聯(lián)起來的新組件的也是一樣的總結(jié)一下高階組件是對代碼進(jìn)行更高層次重構(gòu)的好方法,如果你想精簡你的和生命周期方法,那么高階組件可以幫助你提取出可重用的函數(shù)。 談到react,我們第一個想到的應(yīng)該是組件,在react的眼中可真的是萬物皆組件。就連我們獲取數(shù)據(jù)用到的axios也可以用組件來表示...比如,我...
摘要:在項目中用好高階組件,可以顯著提高代碼質(zhì)量。高階組件的定義類比于高階函數(shù)的定義。高階函數(shù)接收函數(shù)作為參數(shù),并且返回值也是一個函數(shù)。 React 深入系列,深入講解了React中的重點概念、特性和模式等,旨在幫助大家加深對React的理解,以及在項目中更加靈活地使用React。 1. 基本概念 高階組件是React 中一個很重要且比較復(fù)雜的概念,高階組件在很多第三方庫(如Redux)中都...
閱讀 1990·2021-09-22 16:05
閱讀 9252·2021-09-22 15:03
閱讀 2880·2019-08-30 15:53
閱讀 1697·2019-08-29 11:15
閱讀 902·2019-08-26 13:52
閱讀 2348·2019-08-26 11:32
閱讀 1798·2019-08-26 10:38
閱讀 2562·2019-08-23 17:19