可以直接调用动作创建者而不是通过mapStateToProps吗?

时间:2017-10-18 16:55:29

标签: reactjs react-native

我觉得答案应该是肯定的,但我只想确定。

我有这些动作创建者导入:

import {
    updateField,
    goBackOneStep,
    finishStep
} from './signup_actions'

然后,在这个视图的底部,我以前有这个:

export default connect(mapStateToProps, {
    updateField,
    goBackOneStep,
    finishStep
})(InputTel)

我打电话给this.props.finishStep(INPUT_TEL, { tel }, null)

但是,然后我修改了视图以使用Formik,它似乎更喜欢处理来自其HOC的提交操作,所以现在我有这个:

export default connect(mapStateToProps, {
    updateField,
    goBackOneStep
})(withFormik({
    validate,
    validateOnBlur: true,
    validateOnchange: true,
    handleSubmit: ({ tel }) => finishStep(INPUT_TEL, { tel }, null)
})(InputTel))

我只是直接从导入中调用动作创建者。 React和React Native都可以​​吗? (没有反模式或国家混乱?)。我无法找到任何要确认的文档,但我非常确定我从Stephen Grider React课程中记得,无论如何都没有任何区别。

[edit]:这是最终的解决方案。由于Formik特定的上下文,我将包括它:

export default connect(mapStateToProps, {
    updateField,
    goBackOneStep,
    finishStep
})(withFormik({
    validate,
    validateOnBlur: true,
    validateOnChange: true,
    handleSubmit: ({ tel }, { props }) => props.finishStep(INPUT_TEL, { tel }, null)
})(InputTel))

飞行是正确的,因为Redux没有因为没有正确调用动作创建者而触发状态更改。

1 个答案:

答案 0 :(得分:2)

您可以直接调用您的动作创建者,但在这种情况下,它将被称为简单函数,而不是Redux动作创建者。正如您从connect()文档中看到的那样,它的mapDispatchToProps参数接受允许使用Redux的dispatch()包装您的动作创建者的功能,使其成为实际的动作创建者。

为了能够将您的动作创建者功能用作Redux的动作创建者,您需要通过调用dispatch()而不是dispatch(updateField())来调用将它们包装到Redux的updateField()中或使用来自Redux的bindActionCreators