摘要:結語高階函數(shù)對于初學者來說可能不太好理解,但當你深入其中,了解其中的原理之后,我們可以使用高階函數(shù)來完成很多的工作。
前段時間在工作中寫Hybrid頁面時遇到了這樣的一個場景,公司需要一系列的活動組件,在每個組件注冊的時候都需要調(diào)用App端提供的一個接口。一開始也考慮了幾種方式,包括mixin、組件繼承以及react高階組件。但經(jīng)過了種種衡量,最后選擇使用了高階組件的做法。1、Mixins的缺點
React官方已不推薦使用Mixins的技術來實現(xiàn)代碼的重用,Mixins技術有一系列的缺點,首先Mixins會造成命名沖突,我們通過以下的方式來注入Mixins:
var myMixins = require("myMixins"); var Button = React.createClass({ mixins: [myMixins], // ... })
如果你需要注入多個mixins,其中一個是自己的,另外的可能是第三方的。那有可能在兩個mixins里使用了相同名稱的方法,這會使得其中的一個不起作用,而你能做的只有修改其中一個方法的名稱。另一方面,一個mixins一開始可能是非常簡單的,僅僅需要實現(xiàn)某一個功能,但當業(yè)務越加的復雜,需要往其中加入更多的方法的時候,就會變得非常復雜。要深入了解mixins的缺點,可以查看官方博客。
2、組件繼承對于我自己來說這種方法以前使用的比較多,先創(chuàng)建一個BaseComponent,在其中實現(xiàn)一系列公共的方法,其后的每個組件都繼承于這個組件,但缺點是不夠靈活,在基礎組件中只能實現(xiàn)一些比較固定的方法,而對于每個組件的定制化會有很大的限制。
3、React高階組件由于mixins的一系列缺點,React官方也意識到使用mixins所帶來的痛點遠遠高于技術本身產(chǎn)生的優(yōu)點,而高階組件便可以代替mixins,而且當深入之后它還有著更加豐富的用法。
高階組件(HOC)是React中對組件邏輯進行重用的高級技術。但高階組件本身并不是React API。它只是一種模式,這種模式是由React自身的組合性質(zhì)必然產(chǎn)生的。高階函數(shù)
說到高階組件,就先得說到高階函數(shù)了,高階函數(shù)是至少滿足下列條件的函數(shù):
1、接受一個或多個函數(shù)作為輸入
2、輸出一個函數(shù)
在javascript這門函數(shù)為一等公民的語言中,高階函數(shù)的使用還是非常之多的,像我們平時的回調(diào)函數(shù)等等,都用到了高階函數(shù)的知識。我們先來看一個簡單的高階函數(shù)
var fun = function(x, y) { return x + y; }
fun是一個函數(shù),下面我們將整個函數(shù)作為參數(shù)傳遞給另一個函數(shù)
var comp = function(x, y, f) { return f(x,y); }
驗證一下
comp(1,2,fun) // 3高階組件定義
類比高階函數(shù)的定義,高階組件就是接受一個組件作為參數(shù),在函數(shù)中對組件做一系列的處理,隨后返回一個新的組件作為返回值。
我們先定義一個高階組件BaseActivity
const BaseActivity = (WrappedComponent) => { return class extends Component { render() { return () } } } 我的包裹組件
組件接受一個被包裹的組件作為參數(shù),返回了一個經(jīng)過處理的匿名組件。
在其他組件中使用這個高階組件
class Example extends React.PureComponent { constructor(props) { super(props); this.state = { width: "100%", height: "100%" } } componentWillMount() { if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) { return; } else { this.setState({ width: "375px", height: "640px" }) } } render() { let { width, height } = this.state; return () } } export default BaseActivity(Example);
具體用法就是在export 組件的時候,使用BaseActivity函數(shù)來包裹這個組件,看下輸出的react dom內(nèi)容
在Example組件外面包裹了一個匿名組件。
參數(shù)既然高階組件是一個函數(shù),我們就可以向里面?zhèn)鬟f我們需要的參數(shù)
const BaseActivity = (WrappedComponent, title) => { return class extends Component { render() { return () } } } {title}
在Example中這樣export
export default BaseActivity(Example, "這是高階組件的參數(shù)");
我們看下輸出的react dom
可以看到參數(shù)已經(jīng)傳遞進去了。
當然還可以這樣用(柯里化)
const BaseActivity (title) => (WrappedComponent) => { return class extends Component { render() { return () } } } {title}
在Example中這樣export
export default BaseActivity("這是高階組件的參數(shù)")(Example);
這種用法在ant-design的表單以及redux的connect中我們都可以看到
// ant const WrappedDemo = Form.create()(Demo) // redux export default connect(mapStateToProps, mapDispatchToProps)(Counter)
高階組件還可以擴展原組件的props屬性,如下所示:
const BaseActivity (title) => (WrappedComponent) => { return class extends Component { render() { const newProps = { id: Math.random().toString(8) } return () } } } {title}
看下輸出的react dom
高階組件的缺點高階組件也有一系列的缺點,首先是被包裹組件的靜態(tài)方法會消失,這其實也是很好理解的,我們將組件當做參數(shù)傳入函數(shù)中,返回的已經(jīng)不是原來的組件,而是一個新的組件,原來的靜態(tài)方法自然就不存在了。如果需要保留,我們可以手動將原組件的方法拷貝給新的組件,或者使用hoist-non-react-statics之類的庫來進行拷貝。
結語高階函數(shù)對于初學者來說可能不太好理解,但當你深入其中,了解其中的原理之后,我們可以使用高階函數(shù)來完成很多的工作。
如果喜歡就給個Star吧,^_^
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/93755.html
摘要:在項目中用好高階組件,可以顯著提高代碼質(zhì)量。高階組件的定義類比于高階函數(shù)的定義。高階函數(shù)接收函數(shù)作為參數(shù),并且返回值也是一個函數(shù)。 React 深入系列,深入講解了React中的重點概念、特性和模式等,旨在幫助大家加深對React的理解,以及在項目中更加靈活地使用React。 1. 基本概念 高階組件是React 中一個很重要且比較復雜的概念,高階組件在很多第三方庫(如Redux)中都...
摘要:博客地址背景知識在開始講述高階組件前,我們先來回顧高階函數(shù)的定義接收函數(shù)作為輸入,或者輸出另一個函數(shù)的一類函數(shù),被稱作高階函數(shù)。 博客地址:http://www.luckyjing.com/post... 背景知識 在開始講述高階組件前,我們先來回顧高階函數(shù)的定義:接收函數(shù)作為輸入,或者輸出另一個函數(shù)的一類函數(shù),被稱作高階函數(shù)。對于高階組件,它描述的便是接受React組件作為輸入,輸出...
01、介紹 React 高階組件也叫做 React HOC(High Order Component), 它是react中的高級技術, 用來重用組件邏輯。 但高階組件本身并不是React API。它只是一種模式,這種模式是由react自身的組合性質(zhì)必然產(chǎn)生的。 那么在學習高階組件之前有一個概念我們必須清楚,就是高階函數(shù)。 02、高階函數(shù) 概念:高階函數(shù)是一個函數(shù),它接收函數(shù)作為參數(shù)或?qū)⒑瘮?shù)作...
摘要:為了提高代碼的復用性和可維護性,高階函數(shù)應運而生。使用過的同學,不知道有沒有使用過,高階函數(shù)的作用和它是一樣的。高階函數(shù)在編程中扮演的角色就是火鍋鍋底的角色,它有公用的方法和屬性,而各種組件就是肉和蔬菜。 為什么要使用高階組件? 想想以前用原生和jQuery的項目,上千行的code映入眼簾,瞬間有種昏死過去的沖動。代碼難以維護,改一個bug可能出現(xiàn)N個bug,真的是很痛苦。于是乎組件化...
閱讀 1129·2021-09-13 10:29
閱讀 3447·2019-08-29 18:31
閱讀 2718·2019-08-29 11:15
閱讀 3071·2019-08-26 13:25
閱讀 1453·2019-08-26 12:00
閱讀 2470·2019-08-26 11:41
閱讀 3560·2019-08-26 10:31
閱讀 1557·2019-08-26 10:25