2017-10-17 32 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), 
);