【发布时间】:2019-08-31 07:22:13
【问题描述】:
通过研究,我发现 thunk 是您用来将动作链接在一起和/或处理回调、asyc 动作和副作用的工具。
我无法理解thunk middleware 指南。他们一直引用“store.dispatch”(就像大多数关于 redux 的教程一样)但我从来没有真正调用过 dispatch 也从来没有访问过“store”,所以我不确定如何实现他们提出的任何东西。 (我认为这是因为我在反应中使用了 mapDispatchToProps ......这不是我的动作创建者文件中的选项)
以下是我的动作创建者(为了清楚起见,删除了一些代码):
import { CREATE_NEW_SAMPLING_EVENT } from '../Constants/ActionTypes';
import { emptySamplingEvent } from '../Constants/SamplingEvent';
import _ from 'lodash';
import uuidv4 from 'uuid';
export function createNewSamplingEvent(eventName) {
let newEvent = _.cloneDeep(emptySamplingEvent);
newEvent.eventID = uuidv4();
newEvent.eventName = eventName;
newEvent.dateModified = new Date();
//TODO: call an optional callback
//TODO: dispatch eventLinkTable event
return { type: CREATE_NEW_SAMPLING_EVENT, event: newEvent }
}
“待办事项”中列出了我想做的事情。
我有另一个动作,在不同的动作创建者文件和不同的减速器中称为 EVENT_LINK_TABLE,它将来自该动作创建者的 uuid 作为参数。一旦我完成了这个新事件,我想调度这个 EVENT_LINK_TABLE 操作(使用 uuid)。
此外,我想调用一个标准回调(实际上将调度另一个动作 - LOAD_SAMPLNG_EVENT).. 但我不确定如何调用回调并返回动作。我还听说从动作创建者那里这样做是不好的做法,而且我不希望在创建过程中出现故障时发生这种情况。
要添加其他信息,这是我在我的反应代码中调度操作的地方:\
handleBrandNewButtonClick = () => {
this.props.createNewSamplingEvent(this.state.newSamplingEventName);
}
这个组件因此被“连接”了:
const mapStateToProps = function (state) {
return {
samplingEvents: state.SamplingEvents, //to get list of sampling events to check for uniqueness for that user
}
}
const mapDispatchToProps = {
createNewSamplingEvent,
}
export default withRouter(
withStyles(styles, { withTheme: true })
(connect(mapStateToProps, mapDispatchToProps)
(NewEventForm)
)
);
【问题讨论】:
-
我认为您对 redux 的解释不正确。在考虑使用中间件之前,请确保您首先了解 vanilla redux。您的代码的结构使其非常不友好。让动作创建者保持苗条,并将业务逻辑保留在动作本身中
-
动作本身就是
{ type: CREATE_NEW_SAMPLING_EVENT, event: newEvent }...这还不够细吗? redux 工作流程的下一个项目是 reducer,它不允许有副作用。如果我不能在动作中使用它,也不能在减速器中使用它......我不确定我会在哪里放置任何实际逻辑。 -
什么资源告诉你不要在动作中加入任何逻辑?因为那是很多层面的错误。 thunk 的全部意义在于为您提供了很多选项来将逻辑放入操作中
-
redux.js.org/introduction/core-concepts -- “动作是一个普通的 JavaScript 对象(请注意我们没有引入任何魔法?),它描述了发生的事情。”另请参阅下面 Dilshan 的回答 - “动作创建者应该只返回普通对象”(暗示那些普通对象就是动作)
-
我可以看出你的困惑来源。那个声明写得很糟糕。是的,动作是对象,但没有什么能阻止您使用最终运行动作的业务逻辑创建函数。让我进一步详细说明