我正在使用combineReducers來組合所有reducer來創建商店,這是否意味着從任何視圖分派的任何操作都將觸發所有正在調用的reducer以檢查操作類型?是否有點低效?當一個動作被分派時,所有的reducer將被調用?
或者我不完全瞭解redux設計原理?
我正在使用combineReducers來組合所有reducer來創建商店,這是否意味着從任何視圖分派的任何操作都將觸發所有正在調用的reducer以檢查操作類型?是否有點低效?當一個動作被分派時,所有的reducer將被調用?
或者我不完全瞭解redux設計原理?
是的,那是正確的。
但是一個選項,您必須優化這種行爲(從終極版文檔建議)是使用「重新選擇」 https://github.com/rackt/reselect
重新選擇基本上可以讓你創建memoized選擇,因此可以說道具取決於狀態B和狀態C,因此只有在狀態B或狀態C改變時才重新計算道具A.
請注意,這仍然會觸發所有減速器運行(並通過switch語句查看該操作是否適用於它們) - 我相信這種行爲是沒有辦法的。然而,使用重新選擇意味着如果存在影響該狀態的實際更改,則您的頂級組件只會收到一個道具/狀態更改,而不是每次觸發更改並使React重新呈現所有內容,即使該更改沒有影響因爲它與某個地方無關。 (在重新選擇的自述文件中解釋得更好)
是 - 所有減速器在調度操作時都會被調用。你會得到一個很好的副作用。因爲如果找不到動作,每個reducer都會返回默認狀態,您可以使用單個動作設置初始狀態。
儘管我還沒有嘗試過,但它可能會對單個操作產生影響多個縮減器的作用,即改變存儲器兩個不同部分的狀態。
當你添加重新選擇它作爲@luanped建議你可以得到很多噁心的結果!
我目前的堆棧:
添加重選到工作流程,使之與減速機一起工作是上週發生在我身上的最好的事情。
其實我用的是vue.js和redux,謝謝你的建議都一樣。 – elaijuh
歡迎您:)不過,無論如何,雖然所有的reducer都被調用,但真正發生的是switch語句被檢查,只有處理該動作的reducer會做一些工作,所有其他人都不會做任何事情,所以它真的不是性能問題。值得一提的是,現代JS將大開關語句優化爲具有O(1)訪問時間的跳轉表,因此即使動作不匹配多次,您也不必擔心在還原器中評估大型開關語句任何條件。 – luanped
減速器內部的動作觀察者模式會更好,而不是通過開關來完成,它是觀察者模式 –