我觉得答案应该是肯定的,但我只是想确定一下。
我有这些动作创建者导入:
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 课程中,无论哪种方式调用它都没有区别。
[编辑]:这是最终的解决方案。由于其特定于 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 由于未正确调用动作创建者而未触发状态更改。
您可以直接调用您的动作创建者,但在这种情况下,它将作为简单函数调用,而不是作为 Redux 动作创建者调用。正如您从connect()
文档中看到的那样 - 它的mapDispatchToProps
参数接受允许将动作创建者与 Redux 的dispatch()
包装在一起的函数,使他们成为实际的动作创建者。
因此,为了能够将您的动作创建器函数用作 Redux 的动作创建者,您需要通过调用 dispatch(updateField())
而不是 updateField()
来调用将它们自己包装到 Redux 的dispatch()
中,或者从 Redux 使用bindActionCreators
。