2016-07-30 67 views
5

在學習React之後,我還是考慮了許多難以理解的概念。反應 - 擁有不可改變的道具有什麼好處?

其中:道具的不變性。

如果我知道了,那麼組件或多或少就等同於面向對象編程中的對象。

在面向對象編程中,通過方法參數將數據傳遞到對象中。在React中,您獲得了將數據傳遞到組件的道具。

如果將參數傳遞給Java方法,則可以在方法體中更改這些數據。沒問題。

In React不可能,因爲道具是不可變的。

我見過的所有文獻和東西都提到這些不變性是一個重要的概念。但到目前爲止沒有人真的告訴我爲什麼

有人可以告訴我:擁有不可改變的道具有什麼好處?

或分別是:沒有不可變性的最大缺點是什麼?如果道具是可變的,會發生什麼?

作爲一個很好的例子。那麼我可能會得到更大的機會。

+0

相關http://stackoverflow.com/questions/34385243/why-is-immutability-so-importantor-needed-in-javascript/34387971#34387971 –

回答

7

由於我不是函數式編程方面的專家,所以我會盡量保持簡短。我相信有更多經驗的人最終會投中。

首先考慮您的組件,而不是以對象的形式出現,而是作爲函數(如數學術語)。 您的組件是其屬性的功能。更具體地說,這是一個渲染函數。它需要道具和返回HTML(實際上它返回虛擬DOM樹,但這是無關的)

數學函數是。你給他們一個輸入,他們給你一個輸出。 他們沒有副作用他們不使用任何其他輸入。這給你一些很大的好處:

  1. 純功能是可預測。每個輸入將具有完全相同的輸出。可預測的,意味着他們可以優化並利用諸如記憶來緩存他們的結果或不需要渲染你的用戶界面的部分,如果他們的道具沒有改變,因爲你知道他們不會改變
  2. 根據您輸入的內容,當您嘗試調試出現問題時,您將獲得巨大幫助,因爲您無需擔心全局狀態。 你只需要擔心傳遞給你的物業
  3. 您不必擔心純功能執行的順序,因爲它們保證有無副作用
  4. 它允許非常酷的開發者體驗,如時間旅行調試熱插拔組件

這些只是一些好處,像我這樣的普通開發人員可以看到。我確信有真正的函數式編程經驗的人可以有更多。希望它有幫助

+0

副作用意味着它改變整個系統的狀態? –

+0

是的。如果一個函數做的不是它應該做的事情(例如,它在'window'上保存了某些東西,或者在某處增加了一個計數器,這意味着它有副作用,如果另一方面,它需要它的輸入和** ONLY **返回它的結果,這意味着它沒有任何副作用 – Dogoku

+0

想象一下,如果像cd,cp,rm這樣的基本unix命令有副作用,你無法控制將會發生什麼情況,不可能自信而安全地使用計算機。這是一樣的想法,你的組件應該只做他們打算做的事情,而不是更多,在React的情況下,他們不應該改變全局狀態,他們不應該改變他們的道具,他們應該只返回呈現的HTML – Dogoku

3

(看完下面Why can't I update props in react.js?

這是責任的良好分離,如果你只能改變自己的狀態,你的道具間接通信的狀態。這導致更高的凝聚力。

如果組件A允許通過直接更改道具來更改組件B的狀態,那麼可以製作更少理解的代碼。

我希望這回答了爲什麼。

3

不變性的最大好處是無論你的組件是可預測的。由此產生的視圖只是一些道具的地圖。想象一下,如果在層次結構中,每個組件都能夠改變傳遞的道具。跟蹤修改者是很難的。

這就是爲什麼在函數式編程中純函數和不可變類型是常態的原因。推理很容易 - 純函數是輸入和輸出的純映射,就是這樣。

+0

假設我有一個頂部組件,一些中間組件。最後呈現數據的底層組件。如果有人在中間某處製作道具的副本,請更改副本,然後向下傳遞該副本。如果現在發生了一個錯誤,我會處於這種情況:我不能確切地說問題位於何處!不能保證更高級別的數據不變。所以我仍然沒有看到很大的好處。 –

+0

你爲什麼不知道?如果你派生道具,那麼你會知道問題出在道具被修改的位置或道具的來源? 如果您總是發現您通過某個庫或Object.freeze傳遞的數據是不可變的,那麼您完全知道該錯誤的來源來自導出該數據或創建副本的組件。絕對不是來自發起道具的頂級組件。 –

+0

我想我終於明白了...有時候需要一點點前進和後退。非常感謝。 :) –