高階元件 高階函式 一

2022-05-14 11:05:04 字數 4380 閱讀 9600

antd裡面的form表單方面,遇到乙個高階函式,以及高階元件,於是看了一下這方面內容,前輩們的文章寫得也非常詳細,這裡就稍微kobe一下

高階函式與高階元件

高階函式:

高階函式,是一種特別的函式,接受的引數為函式,返回值也是函式

成立條件,二者兼一即可

1).一類特別的函式

a).接受函式型別的引數

b).函式返回值是函式

常見的高階函式:

2).常見

a).定時器:settimeout()/setinterval()

b).promise:promise(()=>{}) then(value=>{},reason=>{})

c).陣列遍歷相關的方法: foreach()/ filter()/ map()/ find()/findindex()

d).fn.bind() 本身是個函式,bind方法返回乙個新的函式方法

e).form.create()() create函式能夠包裝元件,生成另外乙個元件的新功能函式

f).getfielddecorator()()

1)函式作為引數的高階函式

settimeout(()=>,1000)

//

2 函式作為返回值輸出的高階函式

function

foo(x)

} //

平時遇到的應用場景

//ajax中

$.get("/api",function

())

//陣列中

some(), every(),filter(), map()和foreach()

高階元件

1 高階元件就是接受乙個元件作為引數並返回乙個新元件的函式

2 高階元件是乙個函式,並不乙個元件

簡單說:高階元件(函式)就好比乙個加工廠,同樣的配件、外殼、電池..工廠組裝完成就是蘋果手機,華為手機組裝完成就是華為手機,基本材料都是相同,不同工廠(高階元件)有不同的實現及產出。當然這個工廠(高階元件)也可能是針對某個基本材料的處理,總之產出的結果擁有了輸入元件不具備的功能,輸入的元件可以是乙個元件的例項,也可以是乙個元件類,還可以是乙個無狀態元件的函式

解決什麼問題?

隨著專案越來越複雜,開發過程中,多個元件需要某個功能,而且這個功能和頁面並沒有關係,所以也不能簡單的抽取成乙個新的元件,但是如果讓同樣的邏輯在各個元件裡各自實現,無疑會導致重複的**。比如頁面有三種彈窗乙個有title,乙個沒有,乙個又有右上角關閉按鈕,除此之外別無它樣,你總不能整好幾個彈窗元件吧,這裡除了tilte,關閉按鈕其他的就可以做為上面說的基本材料。

高階元件總共分為兩大類

**方式之 操縱prop

刪除prop

import react from 'react'

function

return

render() = this

.props;

return

}}export

default hocremoveprop;

增加prop

render() ;

return

} }

export

default hocaddprop;

const  = this.props;

這是乙個利用es6語法技巧,經過上面的語句,otherprops裡面就有this.props中所有的字段除了user.

假如我們現在不希望某個元件接收user的prop,那麼我們就不要直接使用這個元件,而是把這個元件作為引數傳遞給hocremoveprop,然後我們把這個函式的返回結果當作元件來使用

兩個高階元件的使用方法:

const  newcomponent =hocremoveprop(samplecomponent);

const newcomponent = hocaddprop(samplecomponent,'1111111');

也可以利用decorator語法糖這樣使用:

import react,  from 'react';

@hocremoveprop

class samplecomponent extends component

}export

default samplecomponent;

//

例子: a元件裡面包含b元件

import react , from 'react'

function

return class a extends component}}

export

default a

高階元件應用:

//

傳引數import react, from 'react';

render()

}export

default

//a元件

import react , from 'react'export

return

class a extends component

)   }

} }

//b元件

import react , from 'react'import a from './a.js'class b extends component

年齡:姓名:

) }

}export

default a('提示')(b)

//有兩種方式引用高階函式,第一種入上

//第二種

import react , from 'react'import a from './a.js'@a('提示')

class b extends component

年齡:姓名:

) }

}export

default b

使用高階元件

2.@higherordercomponent

高階元件應用

1.**方式的高階元件

返回的新元件類直接繼承自react.component類,新元件扮演的角色傳入引數元件的乙個**,

在新元件的render函式中,將被包裹元件渲染出來,除了高階元件自己要做的工作,其餘功能全都轉手給了被包裹的元件

2.繼承方式的高階元件

//

**方式的高階元件

render() = this

.props;

return}//

繼承方式的高階元件

render() = this

.props;

this.props =otherprops;

return

super.render()

}}

繼承方式高階元件的實現

//

d.js

render()

const newprops =

return

react.cloneelement(element,newprops,element.props.children)

}} export

default

modifypropshoc //

e.js

import react, from 'react'import d from './d'class e extends component

}export

default

d(e)

import react, from 'react'import d from './d'class f extends component

}export

default

d(f)

import react, from 'react';

render()

}export

修改生命週期

componentwillmount()

render()

const newprops =

return

react.cloneelement(element,newprops,element.props.children)

}}export

default modifypropshoc

React高階元件和高階函式

高階元件 hoc 是react中對元件邏輯進行重用的高階技術,但高階元件本身並不是react api,它只是一種模式,這種模式是由react自身組合性質必然產生的 具體而言,高階元件就是乙個函式,且該函式接受乙個元件作為引數,並返回乙個新的元件const enhancedcomponent high...

python高階一 高階函式

1 函式式程式設計 python特點 不是純函式式程式設計 允許變數存在 支援高階函式 可以傳入函式作為變數 支援閉包 可以返回函式 有限度的支援匿名函式 高階函式 變數可以指向函式 函式的引數可以接收變數 乙個函式可以接收另乙個函式作為引數 def add x,y,f return f x f y...

react之高階元件(一)

當兩個或多個元件有相同的地方,可以將相同的部分抽離出來 先建立三個元件a b c a.js 1 import react,from react 23 class a extends component 11 1213 export default a b.js import react,from r...