2016-07-06 43 views
5

我已經學習了一段時間了ReactJS。讓我感到困惑的一件事就是爲什麼ReactJS在諸如道具,元素等許多方面使用不變性。是否有任何具體原因?這背後的哲學是什麼?ReactJS和不變性

當我嘗試將新屬性添加到props時,出現以下錯誤。

遺漏的類型錯誤:無法添加屬性我,對象是不可擴展

回答

3

由於明顯的性能原因,React使用不變性。 例如

想法是,只要你設置的狀態,你不變異的狀態,但是您克隆它的一部分,然後更新狀態

例如

this.state = { 
entries: [1,2,3] 
} 

你應該做的

當您使用shouldComponentUpdate

this.state.setState({ 
entries: this.state.entries.slice().push(9); //not this.state.entries.push(9) 
}) 

性能提升得以實現

在shouldComponentUpdate你可以比較的參考,而不是由於深檢查

shouldComponentUpdate(prevState,newState){ 
    return prevState.entries != newState.entries 

} 
+0

你能更多地描述我們在這裏實現的性能增益嗎? – VJAI

+0

在這個特定的例子中,考慮到數據大小和缺少其他組件,可能並不多。在具有多個具有任何單個組件樹的多個樹的更大應用程序中,當狀態更改時不更新可以大大增加重新呈現期間的應用程序性能。 –

5

這背後的理念是一個單向數據流 - 數據流下降(從頂層到葉組件)和動作向上流動。

一個組件從道具接收它的數據,並且改變一些東西,它必須調用它的父項並且要求它改變一些東西 - 通常通過回調函數。

你可以在官方網站的Thinking in React頁面閱讀更多關於它的信息,它對這個概念很好的解釋。

+2

我想補充一點,單向數據流比雙向綁定更具可預測性。後者可能在概念上更容易理解,但前者易於調試/可預測性勝出。 – lux