何时,为何以及如何在redux中使用Action Creators?

时间:2017-05-07 12:33:19

标签: ios swift redux

我正在使用Rexwift实现redux编写应用程序。我想知道,什么时候使用动作创作者?为什么?

在阅读tutorial之后,我会像创建者一样只在检查内部状态后才创建动作。例如,我有一个按钮,在用户按下它之后,如果我处于状态A,我想启动一些进程。因此,我必须编写一个动作创建器,它将检查当前状态然后返回正确的动作,或者不动作一点都不然后从同一个地方发出此动作。

我是对的吗?我真的很感激任何一个例子。

第二个问题 - 我必须在哪里实施它?

2 个答案:

答案 0 :(得分:3)

Redux.js和ReSwift表现完全不同。

在回答你的问题之前,请先澄清一下。

清除Redux.js / ReSwift混淆

ReSwift中的动作创建者

“动作创建者”在Redux.js中是一个相当专业的术语,但是从v4开始,ReSwift中的类型定义如下:

public typealias ActionCreator = (_ state: State, _ store: Store) -> Action?

因此,与一般建议相反,您执行可以在调度操作时访问该状态。你不需要Thunk实现,虽然Thunks或Epics可以帮助处理更复杂的情况。

“Action Creators帮助封装动作创建细节”

那真是一口气:)

Redux.js动作是对象文字。如果你在Swift中编写它们,Redux动作更像Dictionary s。这就是Redux.js中Action Actionors为工厂提供便利的方式(如“Factory”, Gang of Four 设计模式)。

ReSwift.Action类型通常在自定义值类型(struct s)中实现。 ReSwift没有遭受Redux.js操作的问题。这意味着通过在ReSwift中创建自定义动作类型,将动作创建集中在一个功能中的好处就消失了。你的类型的初始化程序确实提供了这个。

这描绘了完全不同的画面。

这可能是ReSwift.Store.ActionCreator在州内传递的原因:提供任何好处。以与Redux不同的API为代价。

对您的问题的申请

  

例如,我有一个按钮,在用户按下它之后,如果我处于状态A,我想启动一些进程。所以,我必须编写一个动作创建器,它将检查当前状态然后返回正确的动作,或根本不采取行动。然后从同一个地方发送此动作。

有几种方法可以实现这一目标。

如果您有权访问store变量来调用dispatch,那么您还可以访问其当前的state属性。您可以向商店询问应用程序所处的状态并采取相应措施。通常,您会编写商店订阅者以获取商店更改的“推送通知”,但在这种情况下,您也可以询问商店。

这意味着以下内容将是一个完全有效的实现:

let currentState = store.state
let action: Action = {
    if currentState.someSubstate == "A" {
        return ActionWhenInStateA()
    } else {
        return ActionWhenNotInStateA()
    }
}
store.dispatch(action)

由于ReSwift Store不应该从不同的线程接收调度命令,因此您可以依赖第1行的状态在您调度的最后一行中相同。

TL; DR:您无需ActionCreator即可实现此目的。但是如果你喜欢编写“面向东方”的代码,可以依靠回调代替属性查询:

store.dispatch { state, _ in
    if state.someSubstate == "A" {
        return ActionWhenInStateA()
    } else {
        return ActionWhenNotInStateA()
    }
}

答案 1 :(得分:1)

动作创建者只需创建要由您的商店调度以由Reducer处理的动作。

为方便起见,您应该使用Action Creator来防止每次需要分派操作时声明对象。例如,想象下面的例子:

<button onClick={() => { dispatch({ type: 'MY_ACTION'); }}>

写作更清晰:

<button onClick={() => { dispatch(myActionCreator()); }}

理解它也更直接。

它在内部组件(例如React)中非常有用,您可以通过道具将它们注入并将其称为普通函数(例如,在按钮单击中)。

有几种方法可以声明动作创建者。没有模式可以做到这一点。您可以创建一个名为actions的文件,将其放在此文件中,您可以将它们与reducer一起编写。你决定。

您可以查看documentation以澄清您的想法。您还可以看到this有趣的模式来声明您的动作创建者。

希望它有所帮助。