为什么要调度组件而不是动作文件?

时间:2017-09-28 03:06:31

标签: javascript reactjs redux

在网络上,我看到代码通过import comtypes word = comtypes.client.CreateObject('Word.Application') doc = word.Documents.Open(src_filename) 传递来自this.props.dispatch函数的connect直接从组件调度。我的问题是:为什么不直接从actions文件调度而不是仅仅将一个操作对象返回到组件并从那里调度?我觉得我在这里错过了一些东西。直接从组件调度感觉有点不对,就像当我们可以简单地调用一个函数,传递所需内容,并让动作创建者在我们的反应组件之外为我们进行调度时。

以下是我的意思的简短示例:https://gist.github.com/overthemike/5481dab563c7f97f4151ab1c8c9cb4f1

我错过了什么?

2 个答案:

答案 0 :(得分:2)

这只是一种方法。必须选择你喜欢的东西并且更适合你的代码风格。

我最喜欢的方式就是这样,用ES6:

import { actionA, actionB } from 'path/to/redux/actions'

class MyComponent extends React.Component { ... }

const mapStateToPros = {...}
const mapDispatchToProps = { actionA, actionB }
export default connect(mapStateToPros, mapDispatchToProps)(MyComponent)

通过对mapDispatchToProps使用简写表示法,MyComponent将接收函数actionAactionB作为道具,并且可以使用this.props.actionA进行调用。 const mapDispatchToProps = { actionA, actionB }redux解释为:{/ 1>

const mapDispatchToProps = (dispatch) => {
  return {
    actionA: (...args) => {dispatch(actionA(...args))},
    actionB: ...,
  }
}

因此,调用this.props.actionA()实际上是在调用dispatch(actionA())

答案 1 :(得分:2)

可以直接在连接的组件中调用this.props.dispatch()。但是,我更喜欢保留我的React组件" unaware" Redux没有直接引用dispatch,而是将其他函数称为道具。这样,组件不知道或不关心函数是绑定的Redux动作创建者,来自父级的回调,还是测试中的模拟函数。

正如@cfraser所说,我强烈建议使用"对象速记"将动作创建者传递给connect的语法。

您可能会对我的帖子Idiomatic Redux: Why Use Action Creators?感兴趣,该帖子会详细介绍该主题。

根据您对可追溯性的评论:您将从传递给组件的动作创建者,动作创建者定义,动作类型以及响应该动作类型的减速器向后退步。