React 元件的三種形式

2021-09-16 12:04:59 字數 2015 閱讀 9613

[note: 本文基於 react v15.3.0+ 進行討論]

一般來說,編寫 react 元件的方式有以下三種:

無狀態元件(stateless component)。它是函式式的,不繼承於任何類;

繼承於purecomponent的元件;

繼承於component的元件,這也是最常使用的元件形式。

那麼,這三種形式的使用場景及優劣各是什麼呢?

無狀態元件是通過函式定義的,比如下面這個最簡單的?:

let hello = (props) => hello 

呼叫的時候,和平常元件的使用方式相同:

可以看出,無狀態元件的最大特徵就是沒有內部狀態(廢話),所以無狀態元件的渲染結果完全取決於輸入的props

無狀態元件的優點有以下幾個方面:

缺點有以下兩點:

這類元件的定義方式如下:

class mycomponent extends purecomponent
purecomponent是繼承於component類的,不同的是內部實現了shouldcomponentupdate的優化。它會淺比較元件內部propsstate的值,從而決定元件應不應該重新渲染,purecomponent的使用可以提高 react 應用的效能。

purecomponent中,我們不需要寫類似於

if (this.state.someval !== computedval) )

}

的**來避免元件被重複渲染。

讓我們看看原始碼,

當乙個元件是purecomponent時,會執行下面操作來檢查是否需要update

if (type.prototype && type.prototype.ispurereactcomponent)
這裡用的也是淺比較(shallowequal),所以對於多層巢狀的物件和陣列中的變化都不會被檢測到。比如下面這個例子:

handleclick()  = this.state

items.push('new-item')

this.setstate()

}render()

假設itemlist是乙個purecomponent,因為它執行的是淺比較,所以this.state.items的變化是不會觸發itemlist的更新的。如果要觸發更新,應該使用setstate的另一種呼叫形式,每次都返回乙個新的物件:

handleclick() ));

}

最後需要注意的是,在purecomponent中是不能自己定義的shouldcomponentupdate()方法的。如果實在有這個必要,只能使用component元件。

沒啥說的,這就是最普通的元件形式。

從上面的討論我們可以得出結論,在 react 應用中,應當盡可能多的使用無狀態元件或purecomponent以增強復用性和提高效能。但是,在具體的專案實踐中,我們往往需要通過 ajax 請求獲取資料,並進一步對資料進行處理。為了使元件的職責更加單一,引入了容器元件(container component)的概念。我們可以將資料獲取以及處理的邏輯放在容器元件中,然後將已處理的資料傳遞給展示元件,使得元件的耦合性進一步地降低。

react-redux 中的connect()就是容器元件的一種具體實現。

React建立元件的三種方式

react常見的三種元件建立方式,具體如下 函式式定義的無狀態元件 es5原生方式react.createclass定義的元件 es6形式的extends react.component定義的元件 下面我們簡單說一下,這三種方式的用法 適用場合以及區別 import react,from react...

React三種建立元件的方式

react一共有三種建立方式 1 函式式定義的無狀態元件 2 es5原生方式react.createclass建立元件 3 es6繼承react.component方式 無狀態函式式元件是乙個只帶有render方法的函式,並且該元件是無狀態的,具體的形式如下 function hello props...

React元件繫結this的三種方法

我們在使用react元件時,呼叫方法常常用到this和event物件,預設情況是不會繫結到元件上的,需要特殊處理。節點上使用bind繫結 特點 該方法會在每次渲染元件時都會重新繫結一次,消耗一定的效能。不符合表象與行為分離準則 它屬於es5函式擴充套件的方法function.prototype.bi...