我正在使用Rexwift实现redux编写应用程序。我想知道,什么时候使用动作创作者?为什么?
在阅读tutorial之后,我会像创建者一样只在检查内部状态后才创建动作。例如,我有一个按钮,在用户按下它之后,如果我处于状态A,我想启动一些进程。因此,我必须编写一个动作创建器,它将检查当前状态然后返回正确的动作,或者不动作一点都不然后从同一个地方发出此动作。
我是对的吗?我真的很感激任何一个例子。
第二个问题 - 我必须在哪里实施它?
答案 0 :(得分:3)
Redux.js和ReSwift表现完全不同。
在回答你的问题之前,请先澄清一下。
“动作创建者”在Redux.js中是一个相当专业的术语,但是从v4开始,ReSwift中的类型定义如下:
public typealias ActionCreator = (_ state: State, _ store: Store) -> Action?
因此,与一般建议相反,您执行可以在调度操作时访问该状态。你不需要Thunk实现,虽然Thunks或Epics可以帮助处理更复杂的情况。
那真是一口气:)
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有趣的模式来声明您的动作创建者。
希望它有所帮助。