談談React中的Render Props

2021-08-17 05:52:05 字數 2470 閱讀 1980

簡要介紹:分離ui與業務的方法一直在演進,從早期的mixins,到hoc,再到render prop,本文主要對比hoc,談談render props

1 . 早期的mixins

早期復用業務通過mixins來實現,比如元件a和元件b中,有一些公用函式,通過mixins剝離這些公用部分,並將其組合成乙個公用集合,然後將這個集合傳遞給每個元件呼叫。

//公有的函式部分

const somemixins=

printweight()

}class

extends

react.component

this.printcolor=this.printcolor.bind(this);

} render()>

這是乙個蘋果

div>

}}class

banana

extends

react.component

this.printcolor=this.printcolor.bind(this);

} render()>

這是乙個香蕉

div>

}}

2 . hoc

hoc簡單理解就是元件工廠,接受原始元件作為引數,新增完功能與業務後,返回新的元件。下面來介紹hoc引數的幾個例子。

(1)引數僅為原始元件,比如:

(2)引數為原始元件和乙個物件,比如:

但是這種情況比較少用,如果物件中僅僅傳遞的是屬性,其實完全可以通過元件的props實現值的傳遞,我們用hoc的主要目的是分離業務,關於ui的展示,以及一些元件中的屬性和狀態,我們一般通過props來指定比較方便

(3)引數為原始元件和乙個函式,比如:

這種是hoc的典型例子,原始元件引數表示ui部分,函式引數表示處理邏輯,在hoc工廠中進行耦合後生成新的元件。

(4)柯里化

最常見的是僅以乙個原始元件作為引數,但是在外層包裹了業務邏輯,比如react-redux的conect函式中:

class

admin

extends

react.component

const mapstatetoprops=(state)=>;

}const mapdispatchtoprops=(dispatch)=>

}const connect(mapstatetoprops,mapdispatchtoprops)(admin)

這裡不是嚴格的柯里化,但是思想是一樣的,在hoc的工廠函式中在包一層父函式,用於指定業務邏輯。

3 . hoc的缺點

下面我們來看看hoc的缺點:

(1)難以溯源,且存在屬性覆蓋問題

如果原始元件a,先後通過工廠函式1,工廠函式2,工廠函式3….構造,最後生成了元件b,我們知道元件b中有很多與a元件不同的props,但是我們僅僅通過元件b,並不能知道哪個元件來自於哪個工廠函式。同時,如果有2個工廠函式同時修改了元件a的某個同名屬性,那麼會有屬性覆蓋的問題,會使得前乙個工廠函式的修改結果失效。

(2)hoc是靜態構建的

所謂靜態構建,也就是說生成的是乙個新的元件,並不會馬上render,hoc元件工廠是靜態構建乙個元件,這類似於重新宣告乙個元件的部分。也就是說,hoc工廠函式裡面的宣告週期函式,也只有在新元件被渲染的時候才會執行。

(3)會產生無用的空元件

3 . render props

class

catextends

react.component } />

);}}

class

mouse

extends

react.component ;

} handlemousemove(event) );

} render() } onmousemove=>

div>

);}}

class

mousetracker

extends

react.component />

div>

);}}

上述是官網給出的例子,我們來看主要是部分是下面這兩句:

class  mouse extends react.component

...}......

( )}/>

在使用mouse元件的時候,通過乙個render屬性,傳遞乙個可用元件cat給父元件mouse,而在mouse元件中,可以將本身的state物件傳遞給cat元件,cat元件中的mouse屬性的值與mouse父元件中的state相同。

精簡來說: 就是父元件可以將自己的state傳遞給子元件,而子元件可以根據父元件的state物件,來進行render。

這樣做的好處是:

(1)不用擔心props的命名問題

(2)可以溯源,子元件的props一定是來自於直接父元件

(3)是動態構建的。

react中關於render渲染次數的效能優化

在普通元件裡面可以使用shouldcomponentupdate鉤子函式提公升react效能。nextprops,nextstate 在內部可以判斷元件外部接受的最新屬性與之前的屬性是否一致,從而約束render重新整理的時機。只要結果返回true,render就會立馬執行渲染更新,返回false就...

React中render內不能直接使用物件解決方法

報錯資訊當時沒記下來,只記得情景。業務 不好貼上,直接寫幾個demo值,沒加樣式等,簡單模擬。食物種類 div 蘋果種類 label span div 牛奶種類 label span div 橘子種類 label span div div export default demo這麼寫會報錯,food...

React中render 下獲取子級資料錯誤問題

今天react antd mobx專案開發的時候,遇到了乙個問題,應該是生命週期渲染問題吧。具體是這樣的 位於render 中,這裡假定我要獲取data.questionnaiteproblemlist下的第一項的id。data是獲取到的資料物件,其中包含乙個物件陣列questionnairepro...