2017-08-21 30 views
4

我知道無狀態組件使用起來更加舒適(在特定場景中),但由於無法使用shouldComponentUpdate,這是否意味着組件會爲每個道具更改重新渲染呢?我的問題是,它是否更好(性能明智)使用具有智能shouldComponentUpdate的類組件比使用無狀態組件。具有shouldComponentUpdate與無狀態組件的組件。性能?

就性能而言,無狀態組件是更好的解決方案嗎? 考慮這個傻例如:

const Hello =(props) =>(
     <div> 
      <div> {props.hello}</div> 
      <div>{props.bye}</div> 
     </div>); 

VS

class Hello extends Component{ 
    shouldComponentUpdate(nextProps){ 
     return nextProps.hello !== this.props.hello 
    }; 
    render() { 
     const {hello, bye} = this.props; 
     return (
      <div> 
       <div> {hello}</div> 
       <div>{bye}</div> 
      </div> 
     ); 
    } 
} 

假設這些成分都具有2個道具,我們只希望跟蹤其中的一個更新,如果改變(這是一種常見的用例),使用無狀態功能組件還是類組件更好?

UPDATE

做一些研究,以及經過我同意了明顯的答案。儘管類組件(使用shouldComponentUpdate)的性能更好,但對於簡單組件來說,改進似乎可以忽略不計。所以我的看法是這樣的:

  • 對於複雜的組件使用類由PureComponent或組件擴展(取決於如果你要實現自己的shouldComponentUpdate)
  • 對於簡單的部件,即使這意味着將重新呈現使用功能部件運行
  • 試圖削減爲了從最近可能的階級基礎組件的更新量,使樹爲靜態地(如果需要)
+0

可能重複的[React無狀態組件 - 性能和PureRender](https://stackoverflow.com/questions/41185752/react-stateless-components-performance-and-purerender) –

+0

@MayankShukla所以一般的經驗法則是就性能而言,使用shouldComponentUpdate的狀態是否可取?這是否意味着性能方面沒有理由使用無國籍我是對的?根據[Don的鳴叫](https://twitter.com/dan_abramov): –

+0

:*沒有對它們進行「優化」支持,因爲無狀態組件被內部包裝在一個類中。它是相同的代碼路徑。*在同一主題上查看這個不錯的[**文章**](http://moduscreate.com/react_component_rendering_performance/)。目前沒有任何改善,但將來可能會有所改善。 –

回答

1

我想你應該閱讀Stateless functional components and shouldComponentUpdate #5677

對於複雜的組件,定義shouldComponentUpdate(例如,純渲染)通常會超出無狀態組件的性能優勢。文檔中的句子暗示着我們計劃的未來優化,因此我們不會爲無狀態功能組件分配內部實例(我們只會調用該函數)。我們也可能不會持有道具等微小的優化。我們不討論文檔中的細節,因爲優化尚未實際實現(無狀態組件爲這些優化打開了大門)。

https://github.com/facebook/react/issues/5677#issuecomment-165125151

目前的功能做了沒有經過專門優化,儘管我們可能在未來加入這樣的優化。但現在,他們完全按照課程進行。

https://github.com/facebook/react/issues/5677#issuecomment-241190513

我也建議檢查https://medium.com/missive-app/45-faster-react-functional-components-now-3509a668e69f

要測量的變化,我創造了這個基準測試,結果是相當驚人的!從僅將基於類的組件轉換爲功能組件,我們獲得了6%的加速。但通過將其稱爲簡單功能而非掛載功能,我們可以獲得總計約45%的速度提升。

要回答這個問題:它依賴。 如果您有複雜/繁重的組件,您可能應該執行shouldComponentUpdate。否則,使用常規功能應該沒問題。我認爲對於像你Hello這樣的組件實施shouldComponentUpdate將不會有很大的變化,但它可能不值得在實施時。 你也應該考慮從PureComponent而不是Component延伸。

+0

問題是,現在沒有爲功能組件添加優化。所以(讓我們忽略那些可能很棒的媒體中的「黑客」),你說的是沒有一個無狀態的組件比無狀態更好 - 性能明智。對? –

+0

是的..我會用一些結論編輯我的答案。 – enapupe

+0

好吧,我想我已經有了主意。所以就性能改進而言,對於簡單的組件來說可以忽略不計。 –

相關問題