2016-07-29 57 views
1

如果我在頁面上有五個組件,它們可以從商店獲取某些內容。他們都在聽一家商店。對於所有組件,我在商店中創建偵聽器。聆聽商店vs forceUpdate()

我的問題是 - 我可以使用forceUpdate()而不是偵聽器。送東西在商店並等待更新:

getInitialState: function() { 
    return {val: Store.getFoo}; 
}, 
click: function(info) { 
    Store.updateInfo(info, function() { 
    this.forceUpdate(); 
    }) 
} 

在店:

updateInfo: function(info, callback) { 
    foo = info + someValue; 
    callback() 
} 

但在文檔:

通常情況下,你應該儘量避免forceUpdate的所有使用()和只能從render.props和this.state中讀取render()。這使得您的應用更簡單,更高效

謝謝。

回答

1

可以使用forceUpdate,但你不應該

您目前的方法是正確的(不使用forceUpdate)。

如果你有這些5的共同父母監聽更改並將數據傳遞給子代,則父代碼將變得臃腫,並且當商店更改時,您將有6個組件(父代,5個子代)進行呈現。擁有更多監聽商店的這些「容器」組件會在組件(「獨立子項」)之間創建更多的隔離,並且性能更高,因爲當商店更新時組件重新呈現的次數更少。確保你也使用了shouldComponentUpdate。

如果您想了解更多關於「獨立的孩子」,性能更高的反應,手錶:https://www.youtube.com/watch?v=KYzlpRvWZ6c

+0

知道了,謝謝! – nick

+0

有時'shouldComponentUpdate'是一個痛苦的屁股,當一個組件等待一個對象> 10個屬性,只有一個可以改變。 – nick

+0

另外我想知道爲什麼我不應該?我可以在'render'中存儲變量 - 'let var = Store.getVar();'。如果我在商店中更改'var',我可以執行'forceUpdate()'。我也可以用「獨立的孩子」來做。如果我不發送新的道具,'ForceUpdate'不會重新渲染孩子。更少的代碼,我不需要在'state'中保持變量,只在商店中 – nick