最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How can I get the form values on the submit event of a Redux-Form? - Stack Overflow

programmeradmin1浏览0评论

I'm using Redux-Form and I'm trying to get the form values when the user clicks submit.

These are the outer form props. As you can see, there are submittion functions:

  • onSubmit
  • onSubmitSuccess
  • onSubmitFail

onSubmitSucess and onSubmitFail are never called. onSubmit is called but with no arguments.

All I want is to get the form values so I can post them to an API.

How can I do that?

EDIT (code)

AutoFormInternal.js

class AutoFormInternal extends Component {

    render() {

        let {
            ponentFactory,
            fields,
            fieldMetadata,
            layout,
            handleSubmit,
            submitting
        } = this.props;

        let model = this.props.values;
        let fieldMetadataEvaluated = metadataEvaluator.evaluate(fieldMetadata, model, '', fields);

        let groupComponent = ponentFactory.buildGroupComponent({
            ponent: layoutponent,
            layout: layout,
            fields: fieldMetadataEvaluated,
            ponentFactory: ponentFactory
        });

        return (
            <div className="meta-form">
                <form onSubmit={handleSubmit}>
                    { groupComponent }
                    <ButtonToolbar>
                        <Button type="submit" bsStyle="primary" disabled={submitting}>Submit</Button>
                        <Button disabled={submitting}>Cancel</Button>
                    </ButtonToolbar>
                </form>
            </div>
        )
    }
}

AutoFormInternal.propTypes = {
    fields: PropTypes.object.isRequired,
    handleSubmit: PropTypes.func.isRequired,
    resetForm: PropTypes.func.isRequired,
    submitting: PropTypes.bool.isRequired,
    ponentFactory: PropTypes.object.isRequired,
    entity: PropTypes.object.isRequired,
    layout: PropTypes.object
};

export default reduxForm({
    form: 'simple'
})(AutoFormInternal);

AutoForm.js

class AutoForm extends Component {

    render() {

        let {entity, layout} = metadataProvider.getEntityAndLayout(this.props.schema, this.props.entityName, this.props.layoutName);
        let ponentFactory = this.propsponentFactory;
        let fieldMetadata = metadataProvider.getFields(this.props.schema, entity, layout, f => {
            fponentFactory = ponentFactory;
        });
        let fields = metadataProvider.getReduxFormFields(fieldMetadata);
        let validate = (values) => {
            return metadataValidator.validate(fieldMetadata, values);
        }

        return <AutoFormInternal
            fields={fields}
            fieldMetadata={fieldMetadata}
            entity={entity}
            layout={layout}
            validate={validate}
            ponentFactory={ponentFactory}
            onSubmit={() => console.log('submit')}
            onSubmitSuccess={() => console.log('submit success')}
            onSubmitFail={() => console.log('submit fail')}
             />
    }

}

AutoForm.propTypes = {
    ponentFactory: PropTypes.object.isRequired,
    schema: PropTypes.object.isRequired,
    entityName: PropTypes.string.isRequired,
    layoutName: PropTypes.string.isRequired
};

export default AutoForm;

I'm using Redux-Form and I'm trying to get the form values when the user clicks submit.

These are the outer form props. As you can see, there are submittion functions:

  • onSubmit
  • onSubmitSuccess
  • onSubmitFail

onSubmitSucess and onSubmitFail are never called. onSubmit is called but with no arguments.

All I want is to get the form values so I can post them to an API.

How can I do that?

EDIT (code)

AutoFormInternal.js

class AutoFormInternal extends Component {

    render() {

        let {
            ponentFactory,
            fields,
            fieldMetadata,
            layout,
            handleSubmit,
            submitting
        } = this.props;

        let model = this.props.values;
        let fieldMetadataEvaluated = metadataEvaluator.evaluate(fieldMetadata, model, '', fields);

        let groupComponent = ponentFactory.buildGroupComponent({
            ponent: layout.ponent,
            layout: layout,
            fields: fieldMetadataEvaluated,
            ponentFactory: ponentFactory
        });

        return (
            <div className="meta-form">
                <form onSubmit={handleSubmit}>
                    { groupComponent }
                    <ButtonToolbar>
                        <Button type="submit" bsStyle="primary" disabled={submitting}>Submit</Button>
                        <Button disabled={submitting}>Cancel</Button>
                    </ButtonToolbar>
                </form>
            </div>
        )
    }
}

AutoFormInternal.propTypes = {
    fields: PropTypes.object.isRequired,
    handleSubmit: PropTypes.func.isRequired,
    resetForm: PropTypes.func.isRequired,
    submitting: PropTypes.bool.isRequired,
    ponentFactory: PropTypes.object.isRequired,
    entity: PropTypes.object.isRequired,
    layout: PropTypes.object
};

export default reduxForm({
    form: 'simple'
})(AutoFormInternal);

AutoForm.js

class AutoForm extends Component {

    render() {

        let {entity, layout} = metadataProvider.getEntityAndLayout(this.props.schema, this.props.entityName, this.props.layoutName);
        let ponentFactory = this.props.ponentFactory;
        let fieldMetadata = metadataProvider.getFields(this.props.schema, entity, layout, f => {
            f.ponentFactory = ponentFactory;
        });
        let fields = metadataProvider.getReduxFormFields(fieldMetadata);
        let validate = (values) => {
            return metadataValidator.validate(fieldMetadata, values);
        }

        return <AutoFormInternal
            fields={fields}
            fieldMetadata={fieldMetadata}
            entity={entity}
            layout={layout}
            validate={validate}
            ponentFactory={ponentFactory}
            onSubmit={() => console.log('submit')}
            onSubmitSuccess={() => console.log('submit success')}
            onSubmitFail={() => console.log('submit fail')}
             />
    }

}

AutoForm.propTypes = {
    ponentFactory: PropTypes.object.isRequired,
    schema: PropTypes.object.isRequired,
    entityName: PropTypes.string.isRequired,
    layoutName: PropTypes.string.isRequired
};

export default AutoForm;
Share Improve this question edited Apr 26, 2016 at 17:43 Andre Pena asked Apr 26, 2016 at 17:32 Andre PenaAndre Pena 59.5k53 gold badges210 silver badges257 bronze badges 4
  • Can you paste some code? The part with handleSubmit specifically. – Florent Commented Apr 26, 2016 at 17:38
  • @Florent sure, hold on – Andre Pena Commented Apr 26, 2016 at 17:41
  • @Florent Just did it. Thank you – Andre Pena Commented Apr 26, 2016 at 17:44
  • onSubmit={values => console.log(values)} should work. If not, maybe you should inspect your store after interacting with the form. Your fields may not be properly bound. – Florent Commented Apr 26, 2016 at 17:48
Add a ment  | 

1 Answer 1

Reset to default 6

You should pass the onSubmit function reference to the form's handleSubmit method as a parameter: <form onSubmit={handleSubmit(onSubmit)}>. Notice that the onSubmit function reference is not being called here, you're providing it as a "callback" for form submission.

Now when the form is submitted, it should call the onSubmit function, which should take 1 parameter, the values of the entire form as an object.

class AutoFormInternal extends Component {

render() {

    let {
        ponentFactory,
        fields,
        fieldMetadata,
        layout,
        handleSubmit,
        submitting,
        onSubmit // <-- You need to reference this function passed from the wrapper ponent in order to pass it to redux-form's provided handleSubmit function
    } = this.props;

    ... *snip* ...

    return (
        <div className="meta-form">
            <form onSubmit={handleSubmit(onSubmit)}> // <-- Here's where we pass onSubmit to redux-form's handleSubmit
                { groupComponent }
                <ButtonToolbar>
                    <Button type="submit" bsStyle="primary" disabled={submitting}>Submit</Button>
                    <Button disabled={submitting}>Cancel</Button>
                </ButtonToolbar>
            </form>
        </div>
    )
}
}

AutoFormInternal.propTypes = {
    fields: PropTypes.object.isRequired,
    handleSubmit: PropTypes.func.isRequired,
    onSubmit: PropTypes.func.isRequired,
    resetForm: PropTypes.func.isRequired,
    submitting: PropTypes.bool.isRequired,
    ponentFactory: PropTypes.object.isRequired,
    entity: PropTypes.object.isRequired,
    layout: PropTypes.object
};

export default reduxForm({
    form: 'simple'
})(AutoFormInternal);`

... *snip* ...

return <AutoFormInternal
        fields={fields}
        fieldMetadata={fieldMetadata}
        entity={entity}
        layout={layout}
        validate={validate}
        ponentFactory={ponentFactory}
        onSubmit={(formValues) => console.log(formValues)} // <-- formValues should be now be populated when the form is submitted
        onSubmitSuccess={() => console.log('submit success')}
        onSubmitFail={() => console.log('submit fail')}
         />
发布评论

评论列表(0)

  1. 暂无评论