Redux.js和ReSwift的行爲完全不同。
讓我先澄清一些事情,然後再回答您的問題。
消解Redux.js/ReSwift困惑在ReSwift
「行動創造者」
行動創作者是Redux.js一個相當專業的詞彙,但該類型在ReSwift像這樣定義爲V4的:
public typealias ActionCreator = (_ state: State, _ store: Store) -> Action?
所以違背一般的建議,您做必須在調度的動作點進入狀態。儘管Thunks或Epics可以在更復雜的情況下提供幫助,但您不需要Thunk實施。
那是太拗口了:)
Redux.js行動「行動創作者的幫助封裝行爲產生細節」
是對象文本。如果您要在Swift中編寫它們,Redux操作將更像Dictionary
s。這就是Redux.js中的Action Creators如何爲工廠提供便利(如「工廠」,四人幫設計模式)。
雖然,ReSwift.Action
類型通常以自定義值類型(struct
s)實現。 ReSwift不會遇到Redux.js操作的問題。這意味着通過在ReSwift中創建類型的自定義動作,在一個函數中集中創建動作的好處就消失了。你的類型的初始化器已經提供了這個。
這描繪了一幅完全不同的圖畫。
而這可能是爲什麼ReSwift.Store.ActionCreator
通過的狀態:提供任何好處。以與Redux不同的API爲代價。
應用到你的問題
例如,我有一個按鈕,用戶按下後,我想,如果我在狀態A.很,我必須寫一個行動的創建者啓動一些程序,它將檢查當前狀態,然後返回正確的操作,或根本不操作。然後從同一個地方派發這個動作。
有幾種實現方法。
如果您有權訪問商店變量以致電dispatch
,那麼您也可以訪問其當前的state
屬性。您可以向商店詢問該應用所在的狀態並採取相應行動。通常情況下,您會寫商店訂閱者來獲取商店更改的「推送通知」,但在這種情況下,您還可以詢問商店。
這意味着下面的是一個完全有效的實現:
let currentState = store.state
let action: Action = {
if currentState.someSubstate == "A" {
return ActionWhenInStateA()
} else {
return ActionWhenNotInStateA()
}
}
store.dispatch(action)
由於ReSwift Store
s的不應該從不同的線程接收調度命令,你可以依靠的狀態,從1號線是相同的在最後一行,你派遣的地方。
TL; DR:您不需要來實現此目的。但你可以,如果你喜歡寫「東向」的代碼,靠回調代替財產查詢:
store.dispatch { state, _ in
if state.someSubstate == "A" {
return ActionWhenInStateA()
} else {
return ActionWhenNotInStateA()
}
}
好吧,我想我明白了。仍然 - 你可以請回答這個問題:我有一個按鈕,必須開始發送信息的過程。但從邏輯上講,只有當我的狀態支持這個發送時它才能發送它。否則,它必須發送其他操作 - 給用戶的消息,它還沒有準備好。我必須在哪裏放置這種行爲決定的邏輯? –
這對thunk函數來說是一個很好的用例。 Thunk可以訪問'getState()',所以Thunk可以檢查狀態值並決定是否派發。根據我的評論,這個組件只是調用'this.props.someFunction()',並且不必再擔心它。我在https://gist.github.com/markerikson/ea4d0a6ce56ee479fe8b356e099f857e有一些常見的thunk模式示例。 – markerikson