How do I use Redux-Form with React-Bootstrap?

I am trying to use "redux-form": "^ 6.7.0" with "react-bootstrap": "^ 0.31.0"

My component renders fine, but when I click Submit what I see is an empty object.

Note: I tried to wrap the config with connection first, and as shown below, crush it first with redux form and then with react-redux connect ()

Configuration.js

class Config extends Component {
    render() {
        const { ServerPort, UserID, PortNumber, WWWUrl, SourcePath, FMEPath, pickFile, pickFolder, handleSubmit } = this.props;
        return (
            <Form horizontal onSubmit={handleSubmit}>
                <FormGroup controlId="serverPortBox">
                    <Col componentClass={ControlLabel} sm={2}>Watson Port:</Col>
                    <Col sm={10}>
                        <OverlayTrigger placement="left" overlay={(<Tooltip id="tt1">TCP port for Watson to use</Tooltip>)}>
                            <Field name="WatsonPort" component={FormControl}
                                type="number" min="1024" max="65535" placeholder={ServerPort} />
                        </OverlayTrigger>
                    </Col>
                </FormGroup>

 ......

const CForm = reduxForm({
    form: 'configuration' // a unique name for this form
})(Config);

const Configuration = connect(mapStateToProps, mapDispatchToProps)(CForm)

export default Configuration

      

reducers.js

import { combineReducers } from 'redux'
import { reducer as formReducer } from 'redux-form

......

const reducerList = {
    GLVersion,
    ServerConfig,
    ServerStats,
    form: formReducer
}

export default combineReducers(reducerList)

      

Dashboard.js main package

what I see in the debugger is that config is an empty object

    <Panel className='configPanel'
      collapsible header="Configuration"
      eventKey="1"
      defaultExpanded={true}>
      <Configuration onSubmit={(config) => writeConfig(config)} />
    </Panel>

      

+3


source to share


2 answers


See: https://github.com/erikras/redux-form/issues/2917

Oh, that was a great secret. I followed the advice at https://github.com/react-bootstrap/react-bootstrap/issues/2210 and both extra props and empty submission warnings stopped.

You seem to need to wrap Bootstrap in your custom component (why? I don't know). Also, make sure the custom component is an unmatched component, or after the first key press, the field will blur and lose focus.

There are several warnings in the documentation for the reduction form.

my custom field component FieldInput

  const FieldInput = ({ input, meta, type, placeholder, min, max }) => {
        return (
            <FormControl
                type={type}
                placeholder={placeholder}
                min={min}
                max={max}
                value={input.value}
                onChange={input.onChange} />
        )
    }

      



and I call it like this:

<Field name="ServerPort"
   type='number' 
   component={FieldInput} 
   placeholder={ServerPort} 
   min="1024" max="65535" 
/>

      

see also: https://github.com/erikras/redux-form/issues/1750

So now the definition of FieldInput and Config looks like this:

import React, { Component } from 'react'
import { Field, reduxForm } from 'redux-form'
import { connect } from 'react-redux'
import { Form, FormControl, FormGroup, ControlLabel, Col, Button, Tooltip, OverlayTrigger } from 'react-bootstrap'
import * as Act from '../dash/actions.js'
import FaFolderOpen from 'react-icons/lib/fa/folder-open'
import FaFileCodeO from 'react-icons/lib/fa/file-code-o'

const FieldInput = ({ input, meta, type, placeholder, min, max }) => {
    return (
        <FormControl
            type={type}
            placeholder={placeholder}
            min={min}
            max={max}
            value={input.value}
            onChange={input.onChange} />
    )
}

const Config = ({ ServerPort, UserID, PortNumber, WWWUrl, SourcePath, FMEPath, pickFile, pickFolder, handleSubmit }) => {
    return (
        <Form horizontal onSubmit={handleSubmit}>
            <FormGroup controlId="serverPortBox">
                <Col componentClass={ControlLabel} sm={2}>Watson Port:</Col>
                <Col sm={10}>
                    <OverlayTrigger placement="left" overlay={(<Tooltip id="tt1">TCP port for Watson to use</Tooltip>)}>
                        <Field name="ServerPort" type='number' min="1024" max="65535" component={FieldInput} placeholder={ServerPort}  />
                    </OverlayTrigger>
                </Col>
            </FormGroup>

      

+5


source


Some props required <FormControl>

are passed internally props.input

from <Field>

, see http://redux-form.com/6.6.3/docs/api/Field.md/#props

To pass all of these props in a generic way, instead of doing it explicitly, you can use the following function:

const ReduxFormControl = ({input, meta, ...props}) => {
     return <FormControl {...props} {...input} />
};

      



and then inside the form:

<Field component={ReduxFormControl} ... />

      

So the value, onChange, etc. are transmitted as expected <FormControl>

.

+2


source







All Articles