我使用助焊劑第一和終極版之後很長一段時間以來,我做喜歡他們,我看到他們的利益,但有一個問題一直在我腦海裏突然出現的是:爲什麼我們在Flux/Redux體系結構中分離動作和減速器?
爲什麼我們脫鉤動作和縮減器,並在表示更改狀態(動作)的意圖的調用和更改狀態(reducer)的實際方式之間添加額外的間接指令,這樣更難以提供靜態或運行時保證和錯誤檢查?爲什麼不使用修改狀態的方法或函數?方法或函數將提供靜態保證(使用Typescript或Flow)和運行時保證(找不到方法/函數等),而未處理的操作根本不會引發任何錯誤(無論是靜態還是運行時)我們只能看到預期的行爲沒有發生。
讓我與我們的理論狀態集裝箱(TSC)好一點的例證是:
- 這是超級簡單
- 把它看作陣營組件的狀態界面(的setState,this.state),而不渲染部分。
所以,你唯一需要的是觸發您的組件的重新渲染時,我們TSC的狀態改變,並有可能改變這種狀態,這對我們來說將是修改狀態普通方法:fetchData
,setError
,setLoading
等
我看到的是行動和減速是代碼的動態或靜態調度的解耦,所以不是叫myStateContainer.doSomethingAndUpdateState(...)
你打電話actions.doSomethingAndUpdateState(...)
,你讓整個通量/ redux機器將該動作連接到狀態的實際修改。這整件事情也帶來了thunk,sagas和其他中間件處理更復雜的動作的必要性,而不是僅僅使用常規的javascript控制流。
的主要問題是,這種脫鉤需要你寫了很多的東西,只是爲了實現這一脫鉤: - 動作類型 - - 行動有效載荷 - 的行動創造者的功能(參數) 接口的形狀你的狀態 - 您如何更新您的狀態
比較這對我們的理論狀態容器(TSC): - 你的狀態 的形狀 - - 你的方法 界面如何更新您的狀態
那麼我在這裏想念什麼?這種解耦有什麼好處?
這非常類似於此的其他問題:Redux actions/reducers vs. directly setting state
讓我解釋爲什麼最投票回答這個問題不回答,要麼是我還是原來的問題: - 動作/減速讓你問的問題誰和如何?這可以通過我們的TSC完成,它只是一個實現細節,並且與動作/減速器本身無關。 - Actions/Reducers讓你回到你的狀態:這又是一個關於狀態容器的實現細節的問題,可以通過我們的TSC來實現。我們的TSC可以實現狀態改變命令,中間件和目前通過動作/縮減器實現的任何事情,這只是實現它的一個問題。
非常感謝! Fran
您可以將狀態更改視爲TSC中的事務,也可以考慮React的'setState(oldState => newState)',它也可以被事務處理。我的假設是追蹤'setState'的調用與被調度的追蹤動作相同(實際上,'this.setState'實際上是調度一個與'this'相關的函數,因此相似程度更深。然後,數據流仍然在一個方向上:方法是唯一可以改變狀態的東西,而被改變的狀態將觸發重新渲染,這是非常單向的流程。 – franleplant
重要的是,我的假設,也許我的問題是,如果可以給你一種方式的數據流,靜態類型檢查,事務狀態的變化,而不增加動作和減速器需要的間接指針,那麼它有什麼壞處? – franleplant
它具有較小的可擴展性,並導致更加嚴格的架構,因爲行爲往往會與其影響緊密結合,使得重構變得更加困難。從處理程序中分離動作可使架構更加靈活,這在開發具有不斷變化的需求的大型應用程序時非常重要(Flow的最初用例)。例如,當使用Flow時,使一個動作對先前不存在的狀態部分產生影響是微不足道的。但除此之外,沒有任何問題,正如MobX的存在所證明的那樣,它幾乎就是這樣做的。 –