2015-11-08 58 views

回答

11

是的,那是正確的。

但是一個選項,您必須優化這種行爲(從終極版文檔建議)是使用「重新選擇」 https://github.com/rackt/reselect

重新選擇基本上可以讓你創建memoized選擇,因此可以說道具取決於狀態B和狀態C,因此只有在狀態B或狀態C改變時才重新計算道具A.

請注意,這仍然會觸發所有減速器運行(並通過switch語句查看該操作是否適用於它們) - 我相信這種行爲是沒有辦法的。然而,使用重新選擇意味着如果存在影響該狀態的實際更改,則您的頂級組件只會收到一個道具/狀態更改,而不是每次觸發更改並使React重新呈現所有內容,即使該更改沒有影響因爲它與某個地方無關。 (在重新選擇的自述文件中解釋得更好)

+0

其實我用的是vue.js和redux,謝謝你的建議都一樣。 – elaijuh

+4

歡迎您:)不過,無論如何,雖然所有的reducer都被調用,但真正發生的是switch語句被檢查,只有處理該動作的reducer會做一些工作,所有其他人都不會做任何事情,所以它真的不是性能問題。值得一提的是,現代JS將大開關語句優化爲具有O(1)訪問時間的跳轉表,因此即使動作不匹配多次,您也不必擔心在還原器中評估大型開關語句任何條件。 – luanped

+0

減速器內部的動作觀察者模式會更好,而不是通過開關來完成,它是觀察者模式 –

3

是 - 所有減速器在調度操作時都會被調用。你會得到一個很好的副作用。因爲如果找不到動作,每個reducer都會返回默認狀態,您可以使用單個動作設置初始狀態。

儘管我還沒有嘗試過,但它可能會對單個操作產生影響多個縮減器的作用,即改變存儲器兩個不同部分的狀態。

當你添加重新選擇它作爲@luanped建議你可以得到很多噁心的結果!

我目前的堆棧:

  • 終極版的狀態,動作管理
  • 重新選擇數據轉換層
  • 反應意見

添加重選到工作流程,使之與減速機一起工作是上週發生在我身上的最好的事情。

+0

的完美示例'很多生病的結果'聽起來與'發生在我身上的最好的事情'相反,所以你建議使用'reselect'? – elaijuh

+0

heheh噁心或扭曲===好,但意想不到....是的重新選擇是一個非常強大的工作流程的補充。當你意識到你的選擇器可以返回momoized函數,這取決於你的狀態,你現在在家:) – Kocur4d

+0

@ Kocur4d你是什麼意思'如果沒有找到動作,每個reducer都返回默認狀態你得到你的初始狀態設置單個動作? – Reza

相關問題