2017-10-17 33 views
9

我有以下缩放形式的组件,并且我想使用isSubmitting选择器来禁用提交按钮。然而,当表单提交正在尝试使用的缩略形式正在提交选择器

从未返回true我mapStateToProps功能:

​​3210

render()功能的部分片段:

render() { 
    const { handleSubmit, templates, courses, submitting } = this.props; 

    return (
     <StandardModalComponent 
     id="AssignmentModal" 
     title="Create Essay Draft" 
     primaryAction={['Submit', handleSubmit, { disabled: submitting }]} 
     width={800} 
     > 

我是正确使用选择?

+0

嗨!你能展示'handleSubmit'函数吗? –

+0

仅当您的onSubmit返回Promise时,submitting标志才起作用,以便redux-form可以追踪它何时开始和结束。 https://github.com/erikras/redux-form/issues/1238 –

回答

0

绝对不需要使用isSubmitting选择器与reduxForm hoc。 reduxForm hoc会传递一个submitting道具,该道具可用于检查表单是否正在提交。但是redux形式需要知道它何时提交。如果您的onSubmit返回的值不是Promise,submitting prop始终为false,redux-form无法判断提交何时完成,但如果onSubmit确实返回承诺(如@Sreeragh AR建议的那样),那么它将设置submitting支柱为真,直到承诺解决或被拒绝。

也就是说,还有其他值得注意的地方:你在mapStateToProps内部使用isSubmitting选择器创建器,这真的很糟糕。这将为每个重新生成创建一个选择器。正确的做法是使用createMapStateToProps函数。

const createMapStateToProps =()=> { 
    const isSubmittingSelector = isSubmitting('CreateNewAssignmentForm'); 

    return (state, props) => { 
    const firstTemplate = _.first(props.templates.toList().toJS()); 
    const course = props.courses.getIn([0, 'id']); 
    let values = { submitting: isSubmittingSelector(state) }; 
    if (firstTemplate === undefined) { 
     return values; 
    } 

    if (firstTemplate) { 
     values = { 
     course, 
     template: firstTemplate, 
     submitting: isSubmittingSelector(state), 
     initialValues: { 
      template: firstTemplate.id, 
      wordCount: firstTemplate.essay_wordcount, 
      timezone: momentTimezone.tz.guess(), 
      label: 'TRANSPARENT', 
     }, 
     }; 
    } 

    return values; 
    } 
} 

export default connect(createMapStateToProps())(
    reduxForm({ 
    form: 'CreateNewAssignmentForm', 
    destroyOnUnmount: false, 
    shouldAsyncValidate, 
    shouldValidate, 
    })(CreateNewAssignmentForm), 
);